如何在java中进行多处理,以及期望获得什么速度?

2022-09-02 01:42:21

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

我很想知道多处理如何/是否会进一步加快操作速度?如果是这样,是否有某个地方可用的教程?(Java基础教程提到了一个类,但我对语法不够熟悉,无法自己理解该类:

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

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


答案 1

我很想知道多处理如何/是否会进一步加快操作速度?

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


答案 2

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

  1. ProcessBuilder.start()
  2. Runtime.exec() 解决方法ProcessBuilder
  3. Apache Commons Exec,可以解决Runtime.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;

跟:Runtime

Runtime r = Runtime.getRuntime();
Process p = r.exec("firefox");
p.waitFor(10, TimeUnit.SECONDS);
p.destroy();

使用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);

多处理和多线程之间的主要区别如下:

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

其他链接:


推荐