我有一个任务管道(流水线中的每个任务都有不同的并行性要求),每个任务在不同的ExecutorService中工作。任务工作在数据包上,所以如果我们有10个数据包,那么10个任务将提交给service1,每个数据包一个任务。一旦提交给service1的任务实际调用了,它就可能提交一个新的任务来进一步处理service2、service3的数据集。
以下代码运行良好,即:
shutdown()后,在service1上调用service1shutdown()上调用service2,但是因为提交给service1的所有任务都已经完成,所有任务都是从service1上的任务提交给service2的,所以在shutdown()被调用到service2之前,所有任务都被提交给了service2。- service3等等
ExecutorService[]服务={ service1,service2,service3};int count = 0;for(ExecutorService服务: services) { service.shutdown();service.awaitTermination(1,TimeUnit.HOURS);}不过,我现在添加了一种情况,即service2可以将数据分组分解为更小的数据包,并在service2上提交附加任务,而代码现在正在失败。问题是,一旦shutdown()上的所有任务都完成了,就会在service2上调用service2,但是现在我们想从运行在service2中的任务中提交额外的service2任务
我的问题:
shutdown()是否重新运行,还是会立即返回,但不会停止已提交的任务运行?更新:在下面回答发布于 2012-06-08 14:10:13
Matts的问题看上去可能很有效,但我担心它可能会引发新的问题。
我已经想出了一种解决方案,虽然它看起来有点笨重,但在我的场景中没有很多代码更改就能工作。
我引入了一个新服务(service2a),它运行与service2相同的任务。当service2中的任务想要提交一个小数据包时,它会将它提交给service2a而不是service2,因此在服务2关闭之前,所有子数据包都会提交给service2a。这对我来说是有效的,因为较小的数据包不需要被分解成更多的子包,子数据包的想法只适用于service2(a),而不适用于任何其他服务。
https://stackoverflow.com/questions/10948024
复制相似问题