Java 一个线程有没有办法判断是哪个线程中断了它?
一个线程有没有办法判断是哪个线程中断了它 例如: 没有显示任何内容 //======================== 编辑: 我要找的不是消息或事件机制 但是,这看起来很原始。 获取类类型、线程组或中断优先级的方法 线程将携带一些信息进行处理 典型的用法是系统关闭——中断所有这些操作以使它们脱离工作状态Java 一个线程有没有办法判断是哪个线程中断了它?,java,multithreading,interrupt,Java,Multithreading,Interrupt,一个线程有没有办法判断是哪个线程中断了它 例如: 没有显示任何内容 //======================== 编辑: 我要找的不是消息或事件机制 但是,这看起来很原始。 获取类类型、线程组或中断优先级的方法 线程将携带一些信息进行处理 典型的用法是系统关闭——中断所有这些操作以使它们脱离工作状态 阻塞方法,现在我想不出其他方法了 在中断线程之前,请将所需信息存储在中断线程可以获取的位置。然后,当线程被中断时,让它检查存储在哪里的信息 一个线程有没有办法判断是哪个线程中断了它 一句话:
阻塞方法,现在我想不出其他方法了 在中断线程之前,请将所需信息存储在中断线程可以获取的位置。然后,当线程被中断时,让它检查存储在哪里的信息 一个线程有没有办法判断是哪个线程中断了它 一句话:不 标准JavaSE类库中没有支持此功能的功能 事实上,即使是这个问题也没有得到很好的界定:
- 如果一个线程被不同的线程多次中断,会发生什么情况?应该报告哪一个
- 一个线程检测到它被中断(例如,通过
调用)和发现是哪个线程中断之间的争用情况如何isInterrupted
正如Sotirios评论的那样:如果发信号的线程需要找出发信号的线程,那么
中断
可能是错误的机制。您可能需要构建自己的事件机制,在该机制中,事件携带您所需的信息。您无法在标准线程中分辨,如前所述,如果您需要此机制,那么队列更可能有用
在这种情况下,更好的解决方案可能是改变状态
e、 g
更一般地说,您可以为线程注入要运行的任务
// calling thread needs an action to perform.
sharedThread.execute(runnable); // or invokeLater()
// polling thread, use take() if you want to block.
for(Runnable run; (run = runQueue.poll()) != null;)
run.run();
然而,这并不意味着仅仅因为这可能不是一个好主意就不能这样做
public class Main {
static class MyThread extends Thread {
protected final Queue<Thread> interruptingThreads = new ConcurrentLinkedQueue<>();
MyThread(Runnable target) {
super(target);
}
public Queue<Thread> getInterruptingThreads() {
return interruptingThreads;
}
@Override
public void interrupt() {
interruptingThreads.add(Thread.currentThread());
super.interrupt();
}
}
public static void main(String... ignored) throws Exception {
Thread t = new MyThread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
System.err.println("Interrupted by :" + ((MyThread) Thread.currentThread()).getInterruptingThreads());
}
}
});
t.start();
Thread.sleep(500);
t.interrupt();
}
}
如果这是为了调试,您还可以添加一个中断线程所在位置的堆栈跟踪,称为
interrupt()
如果您只需要知道用于调试的中断线程,而不是在代码中,我发现下面的帖子很有帮助,它描述了添加一个新的SecurityManager:我觉得中断不是正确的通知机制。你能描述一下你的用例吗?假设是一个多线程(多于2个)的环境,你如何保证被中断的线程能看到中断它的线程的信息?你在中断线程之前完成信息的存储,用适当的同步保护保存信息的容器。是的。事件机制听起来好多了。
// calling thread needs an action to perform.
sharedThread.execute(runnable); // or invokeLater()
// polling thread, use take() if you want to block.
for(Runnable run; (run = runQueue.poll()) != null;)
run.run();
public class Main {
static class MyThread extends Thread {
protected final Queue<Thread> interruptingThreads = new ConcurrentLinkedQueue<>();
MyThread(Runnable target) {
super(target);
}
public Queue<Thread> getInterruptingThreads() {
return interruptingThreads;
}
@Override
public void interrupt() {
interruptingThreads.add(Thread.currentThread());
super.interrupt();
}
}
public static void main(String... ignored) throws Exception {
Thread t = new MyThread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
System.err.println("Interrupted by :" + ((MyThread) Thread.currentThread()).getInterruptingThreads());
}
}
});
t.start();
Thread.sleep(500);
t.interrupt();
}
}
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at Main$1.run(Main.java:53)
at java.lang.Thread.run(Thread.java:745)
Interrupted by :[Thread[main,5,]]