Java:独立任务的多个过程

时间:2013-03-08 10:10:27

标签: java multithreading multiprocessing

我的问题很简单:

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

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

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

这是我需要你帮助的地方:

我想要并行化该程序。我试过多线程,但它没有更快的工作!因此,虽然每个模拟都是独立的,但我想进行多处理。我想,例如,创建10个过程,并要求他们运行程序,直到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 Main& java Main& java Main& java Main& java Main& java Main& java Main& java Main& java Main& java Main” 但是我必须手动制作B和C的总和。我相信有更好的方法可以做到这一点!我想创建10个文件,其值为(A),B和C,然后读取所有这些文件并总结它们真的很多工作只是为了求一些整数不是吗?

谢谢你们,我正在等待帮助:D

ps:为了轻松回答,我们假设我有一个名为“prog”的程序,它只接受表示我想要达到的A数的int参数。

3 个答案:

答案 0 :(得分:0)

您可以尝试创建一个主要类,使用Runtime.exec(...)方法之一启动prog。通过这种方式,您可以使用其process' outputStream向主程序传输每个进程计算的值。

答案 1 :(得分:0)

在单台机器上,与多个进程相比,使用多个线程时并行处理更有效。

然而,当在单核/单CPU系统上运行时,并行处理只会带来很小的性能损失,但纯计算没有性能优势。 - 然而,当涉及多个慢速IO时,多线程可能会加速整个过程。

简而言之:多处理总是而不是多线程。

答案 2 :(得分:0)

只有拥有多核CPU时才能实现并行化。运行java.lang.Runtime.availableProcessors()以了解应该运行多少个线程。

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

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