2

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

更准确地说,我有多个任务在我的程序中运行,但它们运行的​​频率并不高。

ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);

我相信没有必要为每个任务都运行一个完整的线程,但每次执行任务时重新启动线程也可能代价高昂。

是否有更好的选择来使线程池成为全球性的?

4

2 回答 2

3

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

不可能跨不同ExecutorService的线程池重用线程。但是,您当然可以将不同类型的Runnable类提交到一个公共线程池。

是否有更好的选择来使线程池成为全球性的?

我没有看到您的应用程序中的“全局”线程池有问题。当然,有人需要知道何时调用shutdown()它,但这是我看到的唯一问题。如果您有很多不同的类正在提交任务,它们都可以访问这组(或 1 个)公共后台线程。

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

我相信没有必要让每个任务都一直运行一个完整的线程,但每次执行任务时重新启动线程也可能代价高昂。

一般来说,除非你分叉成吨的线程,否则每隔一段时间启动一个线程的相对成本相对较小。除非您有来自分析器或其他来源的证据,否则这可能是过早的优化。

于 2013-08-14T14:30:39.083 回答
1

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

于 2014-07-04T15:29:16.810 回答