我有一个在多次迭代中运行的程序。 在每个循环中,我启动了多达 3000 个并发线程,其中一些线程在迭代期间开始并在迭代结束前结束,而其中一些线程处于启动状态并一直存活到迭代结束。
对于每次迭代,我都会重新创建线程。
- 我最好使用哪种类型的执行器:FixedThreadPool?线程池执行器?其他?
- 如果我需要设置线程值的数量 - 最大、最小、固定、任何其他...... - 我应该如何确定它们?
- 我是否应该为每个线程提交创建一个新的 Future 对象以跟踪其状态?
谢谢
最佳答案
3000 个并发线程对于目前的任何硬件来说都太高了。池的大小应反射(reflect)硬件的能力(CPU 核心数)。您将需要尝试不同的大小以获得最佳结果,但是对于 3000 个并发线程,您只会让它们饿死。
您需要的是利用一个队列,您可以在循环中向队列添加任务,工作线程从队列中拉出并执行任务。工作线程将来自一个有限大小的线程池。
所以您肯定想要一个在给定队列上运行的ThreadPoolExecutor
。 javadoc of the class有关于排队策略的有用信息。
关于Java 线程池 - 哪种类型和多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46441953/