【问题标题】:How to deal with blocking Tasks when using ScheduledThreadPoolExecutor使用 ScheduledThreadPoolExecutor 时如何处理阻塞任务
【发布时间】:2011-05-29 23:17:53
【问题描述】:

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

如何做到这一点?

还有一个额外的问题: ScheduledThreadPoolExecuter 的文档指出“如果任务的任何执行遇到异常,则后续执行将被禁止”。就我而言,我宁愿重新启动失败的任务。有没有办法改变这种行为?

【问题讨论】:

  • 如果你有一个阻塞任务,那么通过产生另一个也会阻塞的任务来实现什么。当一个任务阻塞时唯一明智的做法是允许另一个非阻塞任务执行。

标签: java multithreading scheduled-tasks task blocking


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2021-08-18
      • 1970-01-01
      • 2013-02-28
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多