如何重用具有不同ExecutorService对象的线程?

时间:2013-08-14 14:27:58

标签: java concurrency threadpool executorservice

是否可以为我的整个程序设置一个线程池,以便重用线程,或者我是否需要使ExecutorService全局/将其传递给使用它的所有对象。

更准确地说,我有多个在我的程序中运行的任务,但它们不会经常运行。

ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);

我认为没有必要让每个任务都有一个完整的线程运行,但是每次执行任务时重启线程的成本也很高。

是否有更好的替代方案使线程池全局化?

2 个答案:

答案 0 :(得分:3)

  

如何重用不同ExecutorService对象的线程?

不可能在不同的ExecutorService线程池中重用线程。当然,您可以将大量不同类型的Runnable类提交给公共线程池。

  

是否有更好的替代方案使线程池全局化?

我认为应用程序中的“全局”线程池没有问题。有人需要知道何时在其上调用shutdown(),但这是我看到的唯一问题。如果你有很多不同的类提交任务,他们都可以访问这组(或1)常见的后台线程。

然而,您可能会发现不同的任务可能希望使用缓存的线程池,而其他任务则需要固定大小的池,因此仍需要多个池。

  

我认为没有必要让每个任务都有一个完整的线程运行,但是每次执行任务时重启线程的成本也很高。

一般情况下,除非你要求吨和吨线程,否则每隔一段时间启动一次线程的相对成本相对较小。除非您有来自剖析器或其他来源的证据,否则这可能是过早的优化。

答案 1 :(得分:1)

使用Java 8,有一个新的解决方案。 fork join全局线程池: http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html#commonPool--