如何在java中进行多处理,以及期望的速度增益?

sei*_*cle 10 java multiprocessing

我是一个使用Java在csv文件上进行数据处理的新手.为此,我使用Java(线程池)的多线程功能将csv文件批量导入Java,并在每个行上执行一些操作.在我的四核上,多线程可以大大加快这个过程.

我很想知道多处理如何/更加加速操作?如果是这样,是否有可用的教程?(Java Basic Tutorial提到了一个类,但是我不熟悉语法来自己理解这个类:

来自http://download.oracle.com/javase/tutorial/essential/concurrency/procthread.html:

Java虚拟机的大多数实现都作为单个进程运行.Java应用程序可以使用ProcessBuilder对象创建其他进程.多进程应用程序超出了本课程的范围[那时它们在哪里解释?].

Tim*_*der 5

我很好奇,知道多处理将/如何进一步加快操作速度?

不,实际上这可能会使情况变得更糟。如果要从多线程切换为多处理,则可以有效地多次启动JVM。启动JVM并非易事。实际上,台式机上JVM的启动方式与企业公司启动JVM的方式不同,只是为典型的最终用户减少了applet启动的等待时间。


Eug*_*kin 5

在 Java 中有几种方法可以启动一个新进程:

  1. ProcessBuilder.start()
  2. Runtime.exec() 解决 ProcessBuilder
  3. 可以解决的Apache Commons ExecRuntime.exec()

ProcessBuilder

ProcessBuilder pb =
new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory(new File("myDir"));
File log = new File("log");
pb.redirectErrorStream(true);
pb.redirectOutput(Redirect.appendTo(log));
Process p = pb.start();
assert pb.redirectInput() == Redirect.PIPE;
assert pb.redirectOutput().file() == log;
assert p.getInputStream().read() == -1;
Run Code Online (Sandbox Code Playgroud)

Runtime

Runtime r = Runtime.getRuntime();
Process p = r.exec("firefox");
p.waitFor(10, TimeUnit.SECONDS);
p.destroy();
Run Code Online (Sandbox Code Playgroud)

使用 Apache Commons Exec:

String line = "AcroRd32.exe /p /h " + file.getAbsolutePath();
CommandLine cmdLine = CommandLine.parse(line);
DefaultExecutor executor = new DefaultExecutor();
int exitValue = executor.execute(cmdLine);
Run Code Online (Sandbox Code Playgroud)

从多处理和多线程的主要区别

  • 多处理和多线程之间的主要区别在于,多处理允许系统添加两个以上的 CPU,而多线程允许进程生成多个线程以提高系统的计算速度。
  • 多处理系统同时执行多个进程,而多线程系统允许同时执行一个进程的多个线程。
  • 创建进程会消耗时间,甚至耗尽系统资源。然而,创建线程是经济的,因为属于同一进程的线程共享该进程的所有物。
  • 多处理可以分为对称多处理和非对称多处理,而多线程没有进一步分类。

附加链接: