当工作线程有异常时关闭ThreadPoolExecutor

 醒来时t我尚年少你未老 发布于 2023-02-13 14:11

工作线程发出应该启动正常关闭的最佳方式是什么?

我有一个固定大小的线程池,它通过一组连续的任务工作,每个任务持续不超过几秒钟.在正常操作期间,这种方法很好,并且随着工作量的增加而突出.

我遇到的问题是在其中一个线程中抛出异常.如果发生这种情况,我想把整个事情搞砸,并且无法使其正常工作.

目前的做法

我一直使用的天真方法是在"Supervisor"类中使用静态方法,该方法使用标准shutdown()awaitTermination()方法关闭线程池.如果遇到问题,则由任何"Worker"类调用它.这是完成而不是传播异常,因为execute()需要a Runnable并且run()方法不能抛出异常.

这是一些伪代码:

// Finds work to do and passes them on to workers
class Supervisor {

  ThreadPoolExecutor exec;

  static main() {
    exec = new FixedThreadPool(...);
    forever {
      exec.execute(new Worker(next available task));
     }
  }

  static stopThreadPool() {
    exec.shutdown();
    if(!exec.awaitTermination(timeout_value)) {
      print "Timed out waiting on terminate"
    }
  }
}


class Worker {
  run() {
    try {
      // Work goes here
    } catch () {
      Supervisor.stopThreadPool()
    }
  }
}

我看到的效果是线程暂停了一段时间,但后来我看到了超时消息,他们都恢复了处理.这种模式一直持续到我手动关闭它为止.如果我stopThreadPool()在断开循环后调用main方法,则按预期正确关闭.

这种方法显然是错误的,因为它不起作用,但它也感觉设计不对.

重申一个问题:工作线程发出应该启动正常关闭的最佳方式是什么?

附加信息

我在SO上看过的问题有两种:

"我如何杀死线程池中的线程?"

"我怎么知道我的所有线程都已完成?"

那不是我追求的.他们似乎也只谈论一组有限的任务,而我正在处理连续的饲料.

我已经阅读了有关使用exec.submit()Futures 的替代方法,它将责任放在主管类上以检查一切是否正常,但我不知道它是否知道它是否是更好的设计.例外情况是,例外情况,所以我不想在不必要的情况下为正常情况添加工作/复杂性.

(次要注意:这是一个工作项目,还有其他人参与.为了简单,我在问题中说"我".)

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有