温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - How to avoid bottle necks when working with many threads?
java multithreading

java - 使用多个线程时如何避免瓶颈?

发布于 2020-04-09 11:22:08

我有以下循环:

// myList is an ArrayList (10000 elements)
for(MyObject test : myList) {
    test.calculate();
}

而且我认为这是并行化的一个很好的选择,因为每个calculate()操作都不依赖于任何其他操作,它仅使用同一对象内的某些变量进行一些数学运算。

我知道执行以下操作会对性能产生负面影响,因为我将创建10000个线程,这将在4核处理器上创建一个巨大的队列:

// myList is an ArrayList (10000 elements)
for(MyObject test : myList) {
    Thread thread = new Thread() {
        public void run() {
            test.calculate();
        }  
    };
    thread.start();
}

问题是,在这种情况下与多线程一起使用以避免排队的推荐方法是什么?

查看更多

提问者
CIOC
被浏览
73
David Siegal 2020-02-01 06:25

一种更简单的方法是利用Java 8并行流。

myList.parallelStream().forEach( MyObject::calculate);

JVM维护用于此类任务的线程池,其线程数量与计算机上的内核(或超线程)数量一样多。每次遇到并行代码时,它都不会启动新池。也不会为每次迭代增加新线程。

当然,对于任何性能问题,请进行基准测试。在多个线程之间分叉工作,然后加入结果(可能是您希望捕获结果)会产生一些开销。因此,请确保节省的费用超过了开销。