java - 多线程会提高性能吗?场景java

标签 java multithreading

<分区>

我有一个 List<Object> objectsToProcess.假设它包含 1000000 个项目。对于数组中的所有项,您可以像这样处理每一项:

for(Object : objectsToProcess){
    Go to database retrieve data.
    process
    save data
}

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

最佳答案

在所描述的场景中,考虑到该过程是一项耗时的任务,并且考虑到 CPU 有多个核心,多线程确实会提高性能。

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

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

  • 利用多个 CPU 核心,否则这些核心将不会被使用,或者至少不会有助于减少解决给定问题所需的时间 - 如果问题可以分为可以相互独立处理的子问题(可以并行化) ).
  • 让程序同时对多个事物进行操作和 react (即事件线程与 Swing Worker)。

有些编程语言和执行环境会自动创建线程以处理可以并行化的问题。 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/

相关文章:

java - 从错误的线程异常调用

java - 限制 App Engine 访问自定义域上的 G Suite 帐户

java - 多线程初始化同步

java - 如何在 Android 的 Receiver/Service 中获取 CheckBoxPreference 值?

java - 从 Android 的 Jersey Resftul Web 服务传递和接收 JSON 对象

java - Executor 和 PriorityBlockingQueue 上的 ASyncTask

c# - 为什么 Parallel.Foreach 会创建无限线程?

c - 使用 C 和 stdlib 预取文件

可变日期的 Java 8 时间

java - 如何将oracle jdbc驱动程序依赖添加到JIRA插件?