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