使用ScheduledThreadPoolExecutor时如何处理阻塞任务

时间:2010-12-23 13:00:05

标签: java multithreading scheduled-tasks task blocking

我想利用一些轻量级任务管理(例如ScheduledThreadPoolExecutor)来定期执行一些可能阻塞的任务(例如,因为等待获取监视器/锁定)。 在这种情况下,任务管理应该检测到这种情况,并且应该生成阻止相同类型的另一个任务/线程。

如何实现这一目标?

作为奖金问题: ScheduledThreadPoolExecuter的文档指出“如果任务的任何执行遇到异常,则后续执行被抑制”。在我的情况下,我宁愿重新启动失败的任务。有没有办法改变这种行为?

2 个答案:

答案 0 :(得分:2)

对于第一个问题:使用java.util.concurrent.Lock并使用超时调用tryLock()。如果超时到期(比如5秒),则创建一个与当前相同类型的新任务,将其传递给执行程序,然后返回等待锁定,这次是以阻塞方式。

对于第二个问题,我会考虑将计划的作业放在一个大的try / catch块中,以防止意外的异常冒泡到执行程序本身。

答案 1 :(得分:1)

您是否考虑过使用第三方开源软件? Quartz调度程序(http://www.quartz-scheduler.org/)非常灵活,值得一试。