Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个线程有没有办法判断是哪个线程中断了它?_Java_Multithreading_Interrupt - Fatal编程技术网

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,]]