是否可以为我的整个程序设置一个线程池,以便重用线程,或者我是否需要使ExecutorService全局/将其传递给使用它的所有对象。
更准确地说,我有多个在我的程序中运行的任务,但它们不会经常运行。
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
我认为没有必要让每个任务都有一个完整的线程运行,但是每次执行任务时重启线程的成本也很高。
是否有更好的替代方案使线程池全局化?
答案 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--