我有一个任务管道(管道中的每个任务都有不同的并行度要求),每个任务都在不同的 ExecutorService 中工作。任务处理数据包,因此如果我们有 10 个数据包,那么将提交 10 个任务service1
,每个数据包一个任务。一旦提交的任务service1
实际调用,它可能会提交一个新任务以进一步处理数据包到service2
或service3
不。
以下代码工作正常,即:
shutdown()
service1
在所有内容提交后调用service1
然后 awaitTermination() 不会返回,直到在 shutdown() 之前提交的所有任务都实际完成运行。--
shutdown()
然后调用 onservice2
但是因为所有提交的任务service1
都已完成,并且所有任务都提交到service2
from tasks 上的service1
所有任务都已提交过service2
才shutdown()
调用 onservice2
。-- 以此类推service3
ExecutorService[] services = { service1, service2, service3}; int count = 0; for(ExecutorService service: services) { service.shutdown(); service.awaitTermination(1, TimeUnit.HOURS); }
但是,我现在添加了一个案例,service2
可以将数据包分解为较小的数据包并提交额外的任务service2
,但代码现在失败了。问题是一旦所有任务完成后shutdown()
就会调用它,但现在我们想从正在运行的任务提交额外的任务service2
service1
service2
service2
我的问题:
shutdown()
是在所有提交的任务完成运行后重新运行,还是立即返回但不停止已经提交的任务运行?更新:在下面回答- 如何解决我的新问题?