java中是否有默认的线程池

时间:2015-11-23 04:26:33

标签: java multithreading

我可以在java中创建一个新的线程池,并使用ExecutorService.newFixedThreadPoolExecutorService.submit方法在其上执行任务。

我可以在我的java程序中为所有执行程序服务重用“默认”线程池吗?或者我只需要创建一个包含默认线程池的单例? C#有一个默认的线程池,可以在调用Task.Factory.StartNew方法时运行任务。

2 个答案:

答案 0 :(得分:11)

自Java-8以来,ForkJoinPool.commonPool()默认使用许多涉及并行或异步执行的方法。例如,ScrollView或并行Stream API操作使用此池。您可以使用Arrays.parallelSort()CompletableFuture类的许多方法将自己的任务提交到此池。

答案 1 :(得分:6)

使用单独的线程池是好的,默认做法,共享线程池是一种(可能是过早的)优化。

通过Java 7,答案是否定的,没有默认的线程池,建议使用多个线程池。这是很好的分离,可以防止一个任务集合上的阻塞行为干扰另一个任务。

如果您共享线程池,则应该提出以下问题:

  • 日志框架能够区分任务吗? (线程是区分的一种方式。)
  • 如果任务池A意外请求太多线程并被切断,那么任务池B应该饿死吗?当您发现任务池B失败时,您是否能够诊断任务池A中的问题?
  • 如果A区块B应该饿死?

也许您创建的内容类似于LightweightThreadpool。您编写的前5个任务以轻量级方式使用它。第六个任务......确实如此,除了它还将错误写入磁盘,这些错误非常大,有时会有很多错误,并且它们没有被限制。突然之前,前5个任务都被饿死了,不知道是什么击中了它们,而且,当你编写这些任务时,你真的相信它们是安全的,可能没有为这类事件做好准备。

所以共享线程池就好了,因为在同一台服务器上运行两个不同的进程是可以的。您应该首先仔细考虑资源管理,并了解这些任务现在是资源耦合的。缺省默认的线程池试图强制您默认使用单独的线程池,并在共享之前仔细考虑这些问题。

从Java 8开始,答案是“是”(每Tagir's answer on this question)。但是如果你向该线程池提交阻塞任务,你会注意到一切都会失败。