【问题标题】:How do I reuse Threads with different ExecutorService objects?如何重用具有不同 ExecutorService 对象的线程?
【发布时间】:2013-08-16 13:37:15
【问题描述】:

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

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

ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);

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

除了使线程池全局化之外,还有更好的选择吗?

【问题讨论】:

  • 您确定需要线程吗?如果任务非常简单,请在您的线程中执行。
  • 任务需要异步调度和运行。我认为没有其他选择。
  • C# 使用全局线程池,同时让程序员可以创建其他池。我会说这是一个很好的解决方案。如果您需要一个全局执行器,只需创建一个单例工厂,它将托管您的线程池。

标签: java concurrency threadpool executorservice


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    除了使线程池全局化之外,还有更好的选择吗?

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-11
      • 2018-02-28
      • 2021-12-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      相关资源
      最近更新 更多