我们目前正在尝试通过在我们的 java 应用程序中使用多线程来调整性能。我们有一个长时间运行的串行任务,我们希望将其拆分为多个 CPU 内核。
基本上我们有一个清单,让我们说 100.000 件/要做的事情。
我现在的问题是这样做更好:
选项 1(伪代码):
for(i = 0; i < 100000; i++){
threadpool.submit(new MyCallable("1 thing to do"))
}
这会将 100000 个可运行/可调用对象添加到线程池的队列(当前 LinkedBlockingQueue)
还是这样做更好: 选项2(伪代码)
for(i = 0; i < 4; i++){
threadpool.submit(new MyCallable("25000 things to do"))
}
我们已经尝试了选项 1,但我们没有注意到任何性能改进,尽管我们可以清楚地看到多个线程疯狂地工作并且使用了 4 个 CPU 内核。但我的感觉是,由于任务众多,选项 1 中存在一些开销。我们还没有尝试过选项 2,但我的感觉是,它可以加快速度,因为开销更少。我们基本上将列表分成 4 个更大的块,而不是 100000 个单项。
对此有什么想法吗?
谢谢