为什么interrupt()会快速连续中断两个线程?

时间:2018-04-01 14:03:47

标签: java multithreading interrupt

我想启动一个线程,中断它并启动一个新线程。问题是,这不起作用。第一个线程启动并被中断,但是下一个线程在它甚至可以启动之前被中断。所以interrupt()会中断旧线程和新线程。输出如下:

run()-method starts
Thread Counter:0
Thread Counter:1
Thread Counter:2
Thread Counter:3
Thread Counter:4
Thread Counter:5
Thread Counter:6
8 seconds are over 
Thread is not null 
Thread will be interrupted now
catch
run()-method starts
catch
8 seconds are over 
Thread is not null 
Thread will be interrupted now
....

您可以看到该线程第一次启动。然后线程被中断并调用'catch'。到现在为止还挺好。在此之后,下一个线程将开始,但是这次线程立即被中断并且'run'在'run() - 方法启动'之后立即被调用。

所以,我无法弄清楚为什么会这样。我不希望两个线程快速连续中断。

这是我的代码:

public class MyRunnable {
    static Thread myThread; 
    static boolean stop;
    static Runnable myRunny = new Runnable() {
        @Override
        public void run() {
            System.out.println("run()-method starts");
            try {
                int j = 0;
                while (!stop) {
                    Thread.sleep(1000);
                    System.out.println("Thread Counter:"+j); 
                    j++;
                }
            } catch (InterruptedException e) {
                System.out.println("catch");
                myThread.interrupt();
            }
        };
    };

    public static void main(String[] args){
        myThread = null;

        while(true) {
            stop = false;
            if(myThread != null) {
                System.out.println("Thread is not null ");
                System.out.println("Thread will be interrupted now");       
                myThread.interrupt();
            }

            myThread = new Thread(myRunny);
            myThread.start();

            try {
                Thread.sleep(8000);
                System.out.print("8 seconds are over "+ "\n");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

catch (InterruptedException e) {
     System.out.println("catch");
     myThread.interrupt();
}
在调用myThread.interrupt()之前,

myThread字段被替换为新引用,因此您中断了新线程!

答案 1 :(得分:1)

  

所以interrupt()会中断旧线程和新线程。

您的诊断不正确。对Thread.interrupt的调用将中断一个线程一次。

您的示例正在中断一个线程,该线程正在捕获InterruptedException并中断异常处理程序中的第二个线程。正在不同线程上快速连续进行两次调用interrupt

  

我不希望两个线程快速连续中断。

改变

        } catch (InterruptedException e) {
            System.out.println("catch");
            myThread.interrupt();
        }

        } catch (InterruptedException e) {
            System.out.println("catch");
        }