如果它被唤醒,睡眠中断的线程是否应该重新中断自己?

Yod*_*oda 3 java multithreading

该线程一直在工作,直到它被中断,但它不时休眠:

public void run() {
    while (!Thread.interrupted()) {
        //A TASK HERE
        try {
            Thread.sleep((long) (500 + Math.random() * 100));
        } catch (InterruptedException e) {
            interrupt(); //it was interrupted while it was sleeping
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

目的是通过中断线程来杀死线程。我可以像我一样重新中断自己还是应该stop = true在异常条款中设置一个标志?

And*_*ner 6

捕捉循环外的中断:

public void run() {
    try {
        while (true) {
            //A TASK HERE
            Thread.sleep((long) (500 + Math.random() * 100));
        }
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
    }
}
Run Code Online (Sandbox Code Playgroud)

无论您在哪里捕获InterruptedException,如果您还没有真正处理它,最好重新中断当前线程,并且您不能简单地抛出InterruptedException(例如,因为它在一个没有声明它抛出InterruptedExceptionExceptionThrowable)。

这允许run()方法的调用者知道执行被中断,因此他们也可以停止他们正在做的事情。

您可能决定不重新中断线程的主要情况是,如果您正在编写某种线程框架(如 Executors),您可以重用先前中断的线程来执行下一个任务。