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

CIO*_*IOC 0 java multithreading

我有以下循环:

// myList is an ArrayList (10000 elements)
for(MyObject test : myList) {
    test.calculate();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

问题是,在这种类型的场景中使用多线程来避免排队的推荐方法是什么?

ass*_*ias 5

一个简单的方法是使用一个ExecutorService-根据您的描述,您要使用每个处理器一个线程:

int nThreads = Runtime.getRuntime().availableProcessors();
ExecutorService executor = Executors.newFixedThreadPool(nThreads);

for (MyObject test: myList) {
  executor.submit(test::calculate);
}

executor.shutdown();
Run Code Online (Sandbox Code Playgroud)

执行器维护一个内部队列,该队列将保留任务直到前一个任务完成。