【发布时间】:2012-05-30 07:07:14
【问题描述】:
我们目前正在尝试通过在我们的 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 个单项。
对此有什么想法吗?
谢谢
【问题讨论】:
-
对此没有一个通用的答案。这取决于“要做的事情”的性质。您必须进行实验。
-
感谢您提供有用的答案。我知道没有通用的答案,但我想了解每种方法。我们的用例是计算密集型而不是 I/O 限制。我们现在将实施方案 2 并比较结果。
标签: java multithreading threadpool