【发布时间】:2013-09-05 08:55:22
【问题描述】:
我正在开发一个在某些时候启动工作线程的应用程序。该线程的行为会因启动它所使用的参数而有很大差异,但适用以下属性列表:
- 它会做一些小的 I/O 操作
- 它将在 3rd 方库中花费少量时间
- 它可能会为某个子任务创建一些工作线程(这些线程在他们的任务完成后不会被重用)
- 它将花费大部分时间处理数字(不存在阻塞调用)
由于可能的持续时间较长(5 分钟到几个小时,具体取决于输入),我们希望能够中止计算。如果我们选择中止它,我们就不再关心输出,只要线程继续运行,实际上就是在浪费宝贵的资源。由于代码在我们的控制之下,the advised way 就是使用中断来表示中止。
虽然网络上的大多数示例都处理循环某个方法的工作线程,但对我来说并非如此 (similar question here)。此工作线程中的阻塞调用也很少,在这种情况下this article 建议手动检查中断标志。我的问题是:如何处理这个中断?
我看到了几个选项,但无法确定哪个是最“干净”的方法。尽管有我的实际示例,但我主要对如何处理此问题的“最佳实践”感兴趣。
- 抛出某种未经检查的异常:这会以一种快速简单的方式杀死线程,但它让我想起了已弃用的
Thread#stop()方法所使用的ThreadDeath方法,以及它的所有related problems。我可以看到这种方法在自有代码中是可以接受的(由于已知的逻辑流程),但在库代码中是不可接受的。 - 抛出某种检查异常:这会以快速简单的方式终止线程,并通过强制程序员处理此事件来缓解
ThreadDeath类似的问题。但是,它给代码带来了很大的负担,需要在任何地方都提到异常。并非所有内容都会抛出InterruptedException是有原因的。 - 以“迄今为止的最佳结果”或空结果退出方法。由于涉及的课程数量众多,这将是一项非常艰巨的任务。如果没有采取足够的措施,
NullPointerExceptions可能会出现空结果,从而导致与第 1 点相同的问题。在大型代码库中几乎不可能找到这些原因。
【问题讨论】:
-
您可能会尝试在您的中断处理程序或处理程序中简化 (3);尽管如此,考虑将其与某种 RuntimeException 结合起来可能是一个好主意。
标签: java multithreading interrupt