首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中,当executorservice可能向自己提交额外任务时,如何关闭executorservice

在Java中,当executorservice可能向自己提交额外任务时,如何关闭executorservice
EN

Stack Overflow用户
提问于 2012-06-08 11:32:02
回答 5查看 4.8K关注 0票数 2

我有一个任务管道(流水线中的每个任务都有不同的并行性要求),每个任务在不同的ExecutorService中工作。任务工作在数据包上,所以如果我们有10个数据包,那么10个任务将提交给service1,每个数据包一个任务。一旦提交给service1的任务实际调用了,它就可能提交一个新的任务来进一步处理service2service3的数据集。

以下代码运行良好,即:

  • 在将所有内容提交给shutdown()后,在service1上调用service1
  • 在关闭()之前提交的所有任务实际运行完毕后,awaitTermination()才会返回。--然后在shutdown()上调用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任务

我的问题:

  1. 在所有提交的任务运行完毕后,shutdown()是否重新运行,还是会立即返回,但不会停止已提交的任务运行?更新:在下面回答
  2. 我该如何解决我的新问题?
EN

Stack Overflow用户

回答已采纳

发布于 2012-06-08 14:10:13

Matts的问题看上去可能很有效,但我担心它可能会引发新的问题。

我已经想出了一种解决方案,虽然它看起来有点笨重,但在我的场景中没有很多代码更改就能工作。

我引入了一个新服务(service2a),它运行与service2相同的任务。当service2中的任务想要提交一个小数据包时,它会将它提交给service2a而不是service2,因此在服务2关闭之前,所有子数据包都会提交给service2a。这对我来说是有效的,因为较小的数据包不需要被分解成更多的子包,子数据包的想法只适用于service2(a),而不适用于任何其他服务。

票数 0
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10948024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档