2013-03-08 39 views
0

我的问题很简单:Java:多进程独立任务

我在Ubuntu上工作,我用Java编写了一个程序(使用Eclipse IDE)。 程序不会在任何地方读取或写入任何内容,它只是进行大量计算并创建许多自制类的实例。 该程序的输出很简单:在终端写入A,B或C(将其视为一个随机过程)

我必须重复运行程序,直到获得1000000次A并计算次数我得到了B和C,我做到了,它有效,但速度太慢。

例如:输出为: “A:1000000 B:1012458 C:1458”

这是我需要你的帮助:

我想并行程序。我尝试了多线程,但它不能工作得更快!所以,虽然每个模拟都是独立的,但我想要进行多处理。例如,我想创建10个Proccess并让他们运行该程序,直到A出现100000次。 (所以10 * 100000 = 1000000,因为我想) 问题是,我需要知道B和C的总数,现在我得到了每个10的值。

我该怎么办?我尝试了ProcessBuilder(http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html),但我不明白它是如何工作的!

我至今唯一的想法就是要问我的程序(以A至100000)10倍,用下面的命令终端: “Java的主要& Java的主要& Java的主要& Java的主要& Java的主要& java的主& java主要& java主要& java主要& java主要“ 但是,然后我必须使B和C出现的总和MANUALLY。我相信有更好的方法来做到这一点!我想过用(A),B和C的值创建10个文件,然后阅读所有这些文件,并总结它们实际上只是对一些整数求和很多工作,不是吗?

谢谢前锋,我在等待救援:d

PS:要轻松地回答,让我们考虑我有一个名为“编程”是只需要int参数的程序,代表AI的数量要达到。

回答

0

仅当您有多核CPU时,并行才有意义。运行java.lang.Runtime.availableProcessors()来知道应该运行多少个线程。

然后,由于应用程序的内部状态正在改变,因此运行10批次的100000次重复与运行一个具有1000000次重复的批次是不同的,因此请考虑并行是否适用于您的情况。

要知道A,B和C结果的总数,只需对所有线程使用AtomicInteger。每次检查A的计数是否小于1000000.

0

您可以尝试使用Runtime.exec(...)方法的其中一个版本启动您的prog的主类。通过这个,你可以使用它的process' outputStream向主程序传输每个进程计算出的值。

+0

谢谢,它应该以这种方式:) – Beetlejuice 2013-03-13 08:18:15

0

在单台机器上,与多进程相比,使用多线程时并行处理更高效。但是,在单核/单CPU系统上运行时,并行处理只会带来较小的性能损失,但对纯计算没有性能优势。 - 但是,例如,当涉及多个缓慢的IO时,多线程可能最终加速进程。

简而言之:多处理将永远是比多线程更慢

+0

“与多进程相比,使用多线程时并行处理更高效”:现在,几乎每台计算机都是多处理。 Mine有4 * 2内核,所以multu处理比多线程更快 – Beetlejuice 2013-03-13 08:20:32

+0

抱歉,这是一个误解:在多核机器上,单个进程中的多个*线程也被操作系统分配给可用内核。因此单个进程*可以通过多线程并行运行在多个内核上。但是,开销不仅是w.r.t.在一个进程中管理大量*线程*和它们的交互*导致的性能总是低于相同数量的进程所需的**。 – JimmyB 2013-03-14 10:03:48