如何正确处理线程中断

Die*_*rDP 5 java multithreading interrupt

我正在开发一个应用程序,在某些时候启动一个工作线程.此线程的行为将根据用于启动它的参数而有很大差异,但以下属性列表适用:

  • 它会做一些小的I/O操作
  • 它会花费很少的时间在第三方图书馆
  • 它可能会为某个子任务创建一些工作线程(这些线程在完成任务后不会被重用)
  • 它将花费大部分时间来处理数字(没有阻塞调用)

由于可能持续时间很长(5分钟到几个小时,具体取决于输入),我们希望能够中止计算.如果我们选择中止它,我们不再关心输出,并且线程实际上只要它继续运行就浪费宝贵的资源.由于代码在我们的控制之下,建议的方法是使用中断来指示中止.

虽然Web上的大多数示例都涉及循环某些方法的工作线程,但对我来说情况并非如此(此处类似的问题).在这个工作线程中也很少有阻塞调用,在这种情况下,本文建议手动检查中断标志.我的问题是:如何处理这个中断?

我看到了几个选项,但无法确定哪种选择最"干净".尽管我有实际的例子,但我主要对如何处理这个问题的"最佳实践"感兴趣.

  1. 抛出某种未经检查的异常:这将以快速简便的方式杀死该线程,但它让我想起ThreadDeath了已弃用的Thread#stop()方法所使用的方法及其所有相关问题.我可以看到这种方法在拥有的代码中是可接受的(由于已知的逻辑流程),但在库代码中却没有.
  2. 抛出某种经过检查的异常:这将以快速简便的方式ThreadDeath终止线程,并通过强制程序员处理此事件来缓解类似问题.但是,它给代码带来了很大的负担,需要在任何地方提到异常.有一个原因并非一切都会抛出InterruptedException.
  3. 使用"目前为止的最佳结果"或空结果退出方法.由于涉及的课程数量,这将是一项非常艰巨的任务.如果不够谨慎,NullPointerExceptions可能会出现空结果,导致与第1点相同的问题.在大型代码库中几乎不可能找到这些原因.

Pet*_*rey 1

我建议您定期检查 Thread.currentThread().isInterrupted() 在您知道可以安全停止的点并在设置后停止。

您可以在检查此标志并抛出自定义未经检查的异常或错误的方法中执行此操作。