【发布时间】:2019-11-14 14:22:20
【问题描述】:
我想知道给定线程为何被中断。它是被我(我的部分代码)、其他库或任何其他原因打断的吗?
现在我可以通过
中断一个线程Thread.interrupt()
通过
取消未来Future.cancel(boolean mayInterruptIfRunning)
通过
关闭执行器ExecutorService.shutdown() or ExecutorService.shutdownNow()
但是,它们都没有让我选择发送原因(执行中断的信息)。换句话说,我无法使用更详细的消息或原因抛出和捕获 InterruptedException。
编辑: 基于 Glains 解决方案,我准备了一个类似的解决方案,但使用了 Callable
public class MyCallable<T> implements Callable<T> {
private final Callable<T> callable;
private volatile Thread thread;
private volatile String interruptReason;
public MyCallable(final Callable<T> callable) {
this.callable = callable;
this.thread = null;
}
@Override
public T call() throws Exception {
this.thread = Thread.currentThread(); // not getCurrentThread()
try {
return callable.call();
}
catch (InterruptedException e) {
System.out.println("Thread is interrupted: " + this.interruptReason);
}
}
public void interrupt(String interruptReason) {
this.interruptReason = interruptReason;
thread.interrupt();
}
}
【问题讨论】:
-
你到底想对这个原因做什么?
-
在大多数情况下,只需记录它。如果线程被预期的原因中断 - 不需要更多操作,但如果线程被任何其他原因中断,那么我想知道它并记录那次事故
-
你可以控制线程的创建吗?
-
是的,我可以完全控制线程的创建
-
答案是否定的。一个线程可以被中断,但是没有这样的api来获取原因。您必须查看中断的代码。
标签: java multithreading interrupt