Я знаю, что это старый вопрос, но я думаю, что ответы выше на самом деле не совсем правильные. (за исключением @ Skylion's, который на самом деле не затрагивает вопрос ...) :)
Thread.interrupt()
не выдает никаких исключений сам по себе. Это делает две вещи: во-первых он просто устанавливает внутренний прервал -flag, а затем он проверяет, является ли нить, что он был вызван на в настоящее время блокирования деятельности как wait()
, sleep()
или join()
. Если он находит один, то он пробуждает этот метод и вызывает , что метод, чтобы выбросить исключение внутри потока, он был вызван по адресу (не из).
В случае, когда вы вызываете interrupt()
из самой нити, этот поток, очевидно, не может быть в настоящий момент блокирован одним из этих вызовов, поскольку он в настоящий момент выполняет ваш вызов interrupt()
. Таким образом, только внутренний прерван -flag установлен, и исключение не выбрасывается вообще.
В следующий раз, когда вы звоните один из методов блокировки (например, sleep()
в @ OldCurmudgeon примере М.) из этого потока, что метод замечает прервал -flag и бросить InterruptedException
.
Если вы никогда не назовете какой-либо из этих методов, ваш поток будет продолжать работать до тех пор, пока он не завершится каким-либо другим способом и никогда не выбросит InterruptedException
. Это верно, даже если вы вызываете interrupt()
из другого потока.
Таким образом, чтобы заметить, что ваш поток был прерван, вам необходимо либо часто использовать один из блокирующих методов, генерирующих InterruptedException
, а затем бросить курить, когда вы получите один из этих исключений, или вам нужно часто звонить Thread.interrupted()
проверить внутренний прерван -flag себя и бросить, если он когда-либо возвращается true
.
Чтобы исключение быть выброшены методом join()
в основном потоке, вам нужно вызвать interrupt()
на , что нить, а не на MyThread
, например, так:
public static void main(String[] args) {
MyThread t = new MyThread();
t.start();
try {
t.join();
} catch (InterruptedException ex) {
System.out.println("Now it works:");
ex.printStackTrace();
}
}
private static class MyThread extends Thread {
private final Thread parentThread;
public MyThread() {
parentThread = Thread.currentThread();
}
@Override
public void run() {
parentThread.interrupt(); // Call on main thread!!!
}
}
Спасибо за ответ, так что в этом случае, когда мне нужно оценить, прерывается ли другой поток, это флаг isInterrupted()? – iberck
Да, это должно быть сделано. –
Стоит упомянуть, что 'MyThread' также никогда не блокируется. Он умирает естественным образом, пытаясь прервать себя. – Muel