Java:独立任务的多进程

Java:独立任务的多进程,java,multithreading,multiprocessing,Java,Multithreading,Multiprocessing,我的问题很简单: 我正在Ubuntu上工作,我用Java编写了一个程序(使用EclipseIDE)。 该程序不在任何地方读写任何东西,它只是进行大量计算并创建许多自制类的实例。 程序的输出很简单:它在终端中写入A、B或C。(将其视为一个随机过程) 我必须重复运行程序,直到我得到1000000次A,并计算我得到B和C的次数。我做了,它工作了,但太慢了 例如:输出为: “A:100万 B:1012458 C:1458“ 这就是我需要你帮助的地方: 我想把程序并行化。我尝试了多线程,但没有更快!所以,

我的问题很简单:

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

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

例如:输出为: “A:100万 B:1012458 C:1458“

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

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

我该怎么办?我尝试了ProcessBuilder(),但我不明白它是如何工作的

到目前为止,我唯一的想法是在终端上用以下命令询问我的程序(直到100000次): “java Main&java Main&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”的程序,它只表示一个I参数,它代表了一个AI要达到的数目。

< P>你可以尝试使用一个方法的版本来创建一个主类,它启动你的<代码> PROG。通过这种方式,您可以使用its将每个进程计算的值传输到主程序。

在一台机器上,与多个进程相比,使用多个线程时,并行处理效率更高

然而,当在单核/单CPU系统上运行时,并行处理只会带来很小的性能损失,但对于纯计算而言,不会带来性能效益。-然而,例如,当涉及多个慢速IO时,多线程毕竟可能会加快进程


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

只有当您有多核CPU时,并行化才有意义。运行java.lang.Runtime.availableProcessors()以了解应该运行多少线程

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


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

“与多进程相比,使用多线程时并行处理效率更高”:如今,几乎每台计算机都是多进程的。我的内核是4*2,所以multu处理比multi threadingSorry更快,但这是一个误解:在多核机器上,一个进程中的多个线程也由操作系统分配给可用的内核;因此,单个进程可以通过多个线程在多个内核上并行运行。但是,在单个进程中管理多个线程及其交互所产生的开销(不仅仅是w.r.t.性能)始终低于相同数量的进程所需的开销。