Java:另一个多线程Executor中的单线程子Executor

时间:2017-04-07 17:45:54

标签: java multithreading

我想以序列化的方式运行一些任务。对此的典型解决方案是创建

Executor executor = Executors.newSingleThreadedExecutor();

并在此上运行任务。

但是,我已经有一个多线程的线程池。

是否有一种简单的方法可以导出一个行为类似于单线程的子执行器(如:一次只运行一个任务)但是使用另一个(可能是非单线程)执行器作为“后端“而不是创建一个全新的OS线程?

有几个用例说明我们为什么要这样做:

  • 该应用可能已经拥有一个线程池,例如后台任务,用 我们想要重用的设定优先级等。
  • 同样,我们可能会传入一个Executor,它不仅仅是一个普通的线程池(例如,延迟执行以后执行,测量执行时间等)
    • 其中一部分传入MoreExecutors.directExecutor()进行测试(以便例如Futures立即解决)。

编辑:添加了以上示例

2 个答案:

答案 0 :(得分:2)

这样的零线程执行程序称为SerialExecutor,并在java文档中描述为java.util.concurrent.Executor。但它有一点缺点:对于每个提交的Runnable,它会创建一个包装器对象。 My own implementation不会创建其他对象。

答案 1 :(得分:0)

我的建议:不要去那里。

从实际角度来看,这并没有太多意义:你愿意为一个问题引入一个更复杂的解决方案......这不是一个真正的问题。

你看:当那个"其他"多线程服务闲置......为什么首先要有这个?如果你想节省OS线程;你为什么要使用那些似乎对缺乏工作感到厌倦的多线程服务呢?

但如果它不是空闲的 - 你认为你怎么能"逐步进入"来自那个"单线程"的任务服务?以一致的方式?

是的,线程并不便宜;但是当你真正处于保存单个线程为你解决问题的时候......回过去一段然后再问自己:那个空闲的多线程服务呢?

所以,也许有一种技术方法来实现你的想法;不过实话说;我的回答是 - 坚持你已经得到的东西:

Executor executor = Executors.newSingleThreadedExecutor();

并添加其他答案/评论:是的,演员模型可以在这里提供帮助;但混合概念很少是一个好主意。如果Actor方法很好地适合你的整体模型(也许有很好的方法可以改变代码的更多部分来使用它) - 很好。但如果没有;要小心添加额外的概念复杂性只是为了解决问题......正如所说的那样;可能不是一个真正的问题。