<分区>
我有一个 List<Object> objectsToProcess.
假设它包含 1000000 个项目。对于数组中的所有项,您可以像这样处理每一项:
for(Object : objectsToProcess){
Go to database retrieve data.
process
save data
}
我的问题是:多线程会提高性能吗?我会认为处理器默认分配了多线程吗?
<分区>
我有一个 List<Object> objectsToProcess.
假设它包含 1000000 个项目。对于数组中的所有项,您可以像这样处理每一项:
for(Object : objectsToProcess){
Go to database retrieve data.
process
save data
}
我的问题是:多线程会提高性能吗?我会认为处理器默认分配了多线程吗?
最佳答案
在所描述的场景中,考虑到该过程是一项耗时的任务,并且考虑到 CPU 有多个核心,多线程确实会提高性能。
处理器不是分配线程的人。处理器是通过提供多个执行单元/执行上下文来提供线程可以使用的资源(虚拟 CPU/虚拟处理器)的处理器。程序需要自己创建多个线程才能同时利用多个 CPU 内核。
多线程的两个主要原因是:
有些编程语言和执行环境会自动创建线程以处理可以并行化的问题。 Java(目前)还不是其中之一,但自从 Java 8 以来,它正朝着这个方向迈进,而 Java 9 可能会带来更多。
通常您不需要比 CPU 提供的 CPU 内核更多的线程,原因很简单,线程切换和线程同步是会减慢速度的开销。
java.util.concurrent
包提供了许多有助于解决典型的多线程问题的类。您想要的是一个ExecutorService
,您可以将应该并行运行和完成的任务分配给它。 Executors
类提供了用于创建流行类型的 ExecutorService
的因子方法。如果您的问题只是需要并行解决,您可能需要使用 Executors.newCachedThreadPool()
。如果您的问题很紧急,您可能需要使用 Executors.newWorkStealingPool()
。
因此您的代码可能如下所示:
final ExecutorService service = Executors.newWorkStealingPool();
for (final Object object : objectsToProcess) {
service.submit(() -> {
Go to database retrieve data.
process
save data
}
});
}
请注意,如果您采用这种多线程方法,将不再保证处理对象的顺序。
如果您的 objectsToProcess
是可以提供并行流的东西,您也可以这样做:
objectsToProcess.parallelStream().forEach(object -> {
Go to database retrieve data.
process
save data
});
这会将如何处理线程的决定留给 VM,这通常比我们自己实现多线程要好。
进一步阅读:
关于java - 多线程会提高性能吗?场景java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27578208/