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

Java 使用ScheduledThreadPoolExecutor时如何处理阻塞任务,java,multithreading,scheduled-tasks,task,blocking,Java,Multithreading,Scheduled Tasks,Task,Blocking,我想利用一些轻量级任务管理(例如ScheduledThreadPoolExecutor)定期执行一些可能会阻塞的任务(例如,因为等待获取监视器/锁)。 在这种情况下,任务管理应该检测到这种情况,并且应该生成另一个相同类型的任务/线程来阻塞 如何做到这一点 作为一个额外的问题: ScheduledThreadPoolExecuter的文档说明“如果任务的任何执行遇到异常,后续执行将被抑制”。在我的情况下,我宁愿重新启动失败的任务。有没有办法改变这种行为?关于第一个问题:使用java.util.co

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

如何做到这一点

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

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


对于第二个问题,我会考虑在一个大的尝试/ catch块中加入预定的工作,以防止意外的异常冒泡到执行者本身。

< P>你有没有想过使用第三方开源软件?石英调度器(http://www.quartz-scheduler.org/)非常灵活,值得尝试。

如果您有一个阻塞任务,那么生成另一个也会阻塞的任务可以实现什么效果。当一个任务阻塞时,唯一明智的做法是允许另一个非阻塞任务执行。