Вызов Thread.sleep() с * прерванным статусом * установлен?
В настоящее время документация по Java не ясна. Что произойдет, если вы вызовете прерывание в потоке, прежде чем он вызовет Thread.sleep():
//interrupt reaches Thread here
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
return;
}
Будет ли выбрано InterruptedException?
Укажите соответствующую документацию.
Ответы
Ответ 1
Да, это вызовет исключение. Согласно javadoc для Thread.sleep, метод:
Броски: InterruptedException - если какой-либо поток прервал текущий поток. Прерванный статус текущего потока очищается при этом исключении.
"Имеет" в этом случае является неформальным способом обращения к прерванному статусу. Это позор, что он неформальный - если там где-то спецификация должна быть точной и однозначной, ну, она везде, но это первопроходцы, прежде всего.
Способ, с которым работает механизм прерывания, в общем случае - это то, что поток получает прерывание, пока он не прерывается (поскольку он работает), тогда прерывание по существу состоит в том, чтобы ждать, пока поток не будет прерван, вызывает Прерывание Исключения. Это пример этого механизма.
Ответ 2
Поток может быть прерван в любой момент времени, но он не будет иметь никакого эффекта, пока этот поток не проверит его прерывистое состояние с Thread.currentThread().isInterrupted()
или когда он достигнет или уже заблокирован вызовом Thread.sleep(long)
, Object.wait(long)
или другие стандартные методы JDK, которые бросают InterruptedException
, например, в пакет java.nio
. Статус прерывания потока reset, когда вы ловите InterruptedException
или когда вы явно вызываете Thread.interrupted()
(см. Документацию для этого неуловимого метода).
Эта статья JavaSpecialists должна объяснить немного больше о том, как работают прерывания потоков и как правильно их обрабатывать.
Ответ 3
Вы можете использовать следующий класс для проверки поведения. В этом случае цикл не прерывается, и поток умирает, когда он доходит до сна.
открытый класс TestInterrupt {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(){
public void run(){
System.out.println("hello");
try {
for (int i = 0 ; i < 1000000; i++){
System.out.print(".");
}
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("interrupted");
e.printStackTrace();
}
}
};
t.start();
Thread.sleep(100);
System.out.println("about to interrupt.");
t.interrupt();
}
}
Ответ 4
Документы InterruptedException, по-видимому, предполагают, что их можно прервать в другое время
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/InterruptedException.html
Бросок, когда поток ожидает, спящий или иначе приостановлен в течение длительного времени, а другой поток прерывает его с использованием метода прерывания в классе Thread
Также, поскольку это проверенное исключение, оно будет генерироваться только теми способами, которые его объявляют. См
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#interrupt()