多线程可以提高性能吗?方案java

Ror*_*ter 3 java multithreading

我有一个List<Object> objectsToProcess.让我们说它包含1000000项目.对于数组中的所有项目,然后处理每个项目,如下所示:

for(Object : objectsToProcess){
    Go to database retrieve data.
    process
    save data
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:多线程会改善性能吗?我认为处理器默认会分配多线程吗?

Chr*_*jer 8

在所描述的场景中,假设该过程是一项耗时的任务,并且假设CPU具有多个核心,则多线程确实会提高性能.

处理器不是分配线程的人.处理器是通过提供多个执行单元/执行上下文来提供线程可以使用的资源(虚拟CPU /虚拟处理器)的处理器.程序需要自己创建多个线程,以便同时使用多个CPU内核.

多线程的两个主要原因是:

  • 利用多个CPU核心,否则这些CPU核心将被闲置或至少无助于减少解决给定问题所需的时间 - 如果问题可以分为可以彼此独立处理的子问题(可能并行化).
  • 使程序同时对多个事物起作用并做出反应(即Event Thread vs. Swing Worker).

有编程语言和执行环境,其中将自动创建线程以处理可并行化的问题.Java还不是其中之一,但是从Java 8开始,它就是一个很好的方式,而Java 9可能会带来更多.

通常,您不需要比CPU提供CPU内核多得多的线程,原因很简单,线程切换和线程同步是开销减慢的原因.

该软件包java.util.concurrent提供了许多类,可以帮助解决多线程的典型问题.你想要的是ExecutorService你分配应该并行运行和完成的任务.该类Executors提供了用于创建流行类型的ExecutorServices的因子方法.如果你的问题需要同时解决,你可能想要去Executors.newCachedThreadPool().如果你的问题很紧急,你可能想要去Executors.newWorkStealingPool().

因此,您的代码可能如下所示:

final ExecutorService service = Executors.newWorkStealingPool();
for (final Object object : objectsToProcess) {
    service.submit(() -> {
            Go to database retrieve data.
            process
            save data
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您采用这种多线程方法,则不再保证处理对象的顺序.

如果你objectsToProcess的东西可以提供并行流,你也可以这样做:

objectsToProcess.parallelStream().forEach(object -> {
    Go to database retrieve data.
    process
    save data
});
Run Code Online (Sandbox Code Playgroud)

这将决定如何处理VM的线程,这通常比自己实现多线程更好.

进一步阅读: