Java 线程池 - 哪种类型和多少?

标签 java multithreading threadpool

我有一个在多次迭代中运行的程序。 在每个循环中,我启动了多达 3000 个并发线程,其中一些线程在迭代期间开始并在迭代结束前结束,而其中一些线程处于启动状态并一直存活到迭代结束。

对于每次迭代,我都会重新创建线程。

  1. 我最好使用哪种类型的执行器:FixedThreadPool?线程池执行器?其他?
  2. 如果我需要设置线程值的数量 - 最大、最小、固定、任何其他...... - 我应该如何确定它们?
  3. 我是否应该为每个线程提交创建一个新的 Future 对象以跟踪其状态?

谢谢

最佳答案

3000 个并发线程对于目前的任何硬件来说都太高了。池的大小应反射(reflect)硬件的能力(CPU 核心数)。您将需要尝试不同的大小以获得最佳结果,但是对于 3000 个并发线程,您只会让它们饿死。

您需要的是利用一个队列,您可以在循环中向队列添加任务,工作线程从队列中拉出并执行任务。工作线程将来自一个有限大小的线程池。

所以您肯定想要一个在给定队列上运行的ThreadPoolExecutorjavadoc of the class有关于排队策略的有用信息。

关于Java 线程池 - 哪种类型和多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46441953/

相关文章:

java - 如何从 Android 应用程序中编辑资源文件? (安卓工作室)

java - 为什么我的 ArrayList 的 ArrayList 值在设置后会变回来?

.net - .net中实现多线程的不同方式是什么?

multithreading - 如何从线程返回包含 Rc 的类型?

java - 以负载均衡方式在 4 个线程上分配 10 个无限作业 (Java)

C++工作队列与阻塞

multithreading - 如何在顺序图中显示将命令提交到线程池中

java - 同步和非同步方法之间的jvm区别

java - 像 Scala 这样的 Java 中的三重引号

java - 调度的Executor任务线程发生异常如何通知主线程?