我想以序列化的方式运行一些任务。典型的解决方案是创建一个
Executor executor = Executors.newSingleThreadedExecutor();
并在这个上运行任务。
但是,我已经有了一个多线程的线程池。
是否有一种简单的方法来派生一个行为类似于单线程的子执行器(如:一次只运行一个任务)但使用另一个(可能是非单线程的)执行器作为“后端”而不是创建一个全新的操作系统线程?
有几个用例说明我们为什么要这样做:
- 该应用程序可能已经有一个线程池,例如后台任务,与 我们希望重用的设定优先级等。
- 类似地,我们可能会传入一个不仅仅是普通线程池的 Executor(例如,延迟执行以备后用,测量执行时间等)
- 其中的一个子集正在通过 MoreExecutors.directExecutor() 进行测试(以便 Futures 等立即解析)。
编辑:添加了上面的例子
最佳答案
这样的零线程执行器称为 SerialExecutor
,在 java.util.concurrent.Executor
的 java 文档中有描述。然而,它有一个小缺点:对于每个提交的 Runnable
,它都会创建一个包装器对象。 My own implementation不会创建额外的对象。
关于Java:另一个多线程执行器中的单线程子执行器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43284210/