为了账号安全,请及时绑定邮箱和手机立即绑定

跳到单线程 ExecutorSerivce 中的下一个任务?

跳到单线程 ExecutorSerivce 中的下一个任务?

侃侃无极 2023-06-08 13:57:42
我正在考虑实施 ExecutorService 来运行一系列任务。我计划使用内部队列让一些任务等待轮到它们运行。有什么方法可以中断当前在 ExecutorService 线程中运行的任务(Runnable),并让线程保持活动状态以运行下一个任务?或者只能调用.shutdown()然后创建一个新的 ExecutorService?想知道是否还有其他解决方案。
查看完整描述

2 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

您可能希望有一个Task class(扩展或包装Runnable)实现中断机制(例如boolean标志)的线程,而不是干扰线程。

当你执行你的任务时,你需要定期检查这个标志,如果它被设置,任务应该停止它正在做的事情。此时您可能想要返回一个特定的结果,告诉您的代码任务已成功取消。

如果用户现在决定不再需要此任务的结果,则必须设置此标志。然而,此时任务可能已经完成,因此您仍然需要处理结果已经存在但用户不再关心它的情况。


线程级别的中断并不能保证线程停止工作。这仅在线程处于可以接收interrupt.

此外,您不应直接干扰 的线程ExecutorSerivce,因为您可能会无意中停止不同的任务或停止ExecutorSerivce正常工作。


查看完整回答
反对 回复 2023-06-08
?
跃然一笑

TA贡献1826条经验 获得超6个赞

您为什么要终止该任务并继续执行下一个任务?如果是时间问题,您可以定义比您在执行它们的方法中声明的时间更长的线程将被自动取消。例如:


ExecutorService executor = Executors.newSingleThreadExecutor();

executor.invokeAll(Arrays.asList(new Task()), 60, TimeUnit.SECONDS); // Timeout of 60 seconds.

executor.shutdown();

如果任何线程花费的时间超过 60 秒,它将抛出一个cancellation.Exception()你必须捕获的


查看完整回答
反对 回复 2023-06-08
  • 2 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信