我想利用一些轻量级任务管理(例如ScheduledThreadPoolExecutor)来定期执行一些可能阻塞的任务(例如,因为等待获取监视器/锁定)。 在这种情况下,任务管理应该检测到这种情况,并且应该生成阻止相同类型的另一个任务/线程。
如何实现这一目标?
作为奖金问题: ScheduledThreadPoolExecuter的文档指出“如果任务的任何执行遇到异常,则后续执行被抑制”。在我的情况下,我宁愿重新启动失败的任务。有没有办法改变这种行为?
答案 0 :(得分:2)
对于第一个问题:使用java.util.concurrent.Lock并使用超时调用tryLock()。如果超时到期(比如5秒),则创建一个与当前相同类型的新任务,将其传递给执行程序,然后返回等待锁定,这次是以阻塞方式。
对于第二个问题,我会考虑将计划的作业放在一个大的try / catch块中,以防止意外的异常冒泡到执行程序本身。
答案 1 :(得分:1)
您是否考虑过使用第三方开源软件? Quartz调度程序(http://www.quartz-scheduler.org/)非常灵活,值得一试。