我想以序列化的方式运行一些任务。对此的典型解决方案是创建
Executor executor = Executors.newSingleThreadedExecutor();
并在此上运行任务。
但是,我已经有一个多线程的线程池。
是否有一种简单的方法可以导出一个行为类似于单线程的子执行器(如:一次只运行一个任务)但是使用另一个(可能是非单线程)执行器作为“后端“而不是创建一个全新的OS线程?
有几个用例说明我们为什么要这样做:
编辑:添加了以上示例
答案 0 :(得分:2)
这样的零线程执行程序称为SerialExecutor
,并在java文档中描述为java.util.concurrent.Executor
。但它有一点缺点:对于每个提交的Runnable
,它会创建一个包装器对象。 My own implementation不会创建其他对象。
答案 1 :(得分:0)
我的建议:不要去那里。
从实际角度来看,这并没有太多意义:你愿意为一个问题引入一个更复杂的解决方案......这不是一个真正的问题。
你看:当那个"其他"多线程服务闲置......为什么首先要有这个?如果你想节省OS线程;你为什么要使用那些似乎对缺乏工作感到厌倦的多线程服务呢?
但如果它不是空闲的 - 你认为你怎么能"逐步进入"来自那个"单线程"的任务服务?以一致的方式?
是的,线程并不便宜;但是当你真正处于保存单个线程为你解决问题的时候......回过去一段然后再问自己:那个空闲的多线程服务呢?
所以,也许有一种技术方法来实现你的想法;不过实话说;我的回答是 - 坚持你已经得到的东西:
Executor executor = Executors.newSingleThreadedExecutor();
并添加其他答案/评论:是的,演员模型可以在这里提供帮助;但混合概念很少是一个好主意。如果Actor方法很好地适合你的整体模型(也许有很好的方法可以改变代码的更多部分来使用它) - 很好。但如果没有;要小心添加额外的概念复杂性只是为了解决问题......正如所说的那样;可能不是一个真正的问题。