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)
我的问题是:多线程会改善性能吗?我认为处理器默认会分配多线程吗?
在所描述的场景中,假设该过程是一项耗时的任务,并且假设CPU具有多个核心,则多线程确实会提高性能.
处理器不是分配线程的人.处理器是通过提供多个执行单元/执行上下文来提供线程可以使用的资源(虚拟CPU /虚拟处理器)的处理器.程序需要自己创建多个线程,以便同时使用多个CPU内核.
多线程的两个主要原因是:
有编程语言和执行环境,其中将自动创建线程以处理可并行化的问题.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的线程,这通常比自己实现多线程更好.
进一步阅读:
| 归档时间: |
|
| 查看次数: |
9861 次 |
| 最近记录: |