У меня есть поток, который вызывает метод work(), который представляет собой простой цикл while(true), как показано ниже;
public void work() throws InterruptedException {
while (true) {
// PART A
if (Thread.currentThread().isInterrupted()) {
System.out.println("....run()::work::PART A::isInterrupted():" + Thread.currentThread().isInterrupted());
Thread.sleep(2000);
}
// Is it possible to make the below code executable at runtime when thread is interrupted?
// PART B
if (Thread.currentThread().isInterrupted()) {
System.out.println("....run()::work::PART B::isInterrupted():" + Thread.currentThread().isInterrupted());
Thread.sleep(2000);
}
}
}
Я запускаю этот экземпляр потока и прерываю поток из основного через некоторое время с помощью метода Thread.sleep(). Когда я изменяю задержку, я ожидаю попадания в закомментированную часть, когда поток прерывается из основного потока, но я вижу только вывод ниже;
....run()::Work::starting
.main()::interrupting thread t
.main()::leaving
....run()::work::PART A::isInterrupted():true
....run()::Work::ERROR::INTERRUPTED
Мой простой вопрос заключается в следующем: возможно ли выполнить вторую часть (Часть B) метода work(), а если нет, то почему?
Полная демонстрация показана ниже;
public class GeneralInterrupt implements Runnable {
public void run() {
try {
System.out.println("....run()::Work::starting");
work();
System.out.println("....run()::Work::ended");
} catch (InterruptedException x) {
System.out.println("....run()::Work::ERROR::INTERRUPTED");
return;
}
System.out.println("....run()::Work::leaving normally");
}
public void work() throws InterruptedException {
while (true) {
// PART A
if (Thread.currentThread().isInterrupted()) {
System.out.println("....run()::work::PART A::isInterrupted():" + Thread.currentThread().isInterrupted());
Thread.sleep(2000);
}
// Is it possible to make the below code executable at runtime when thread is interrupted?
// PART B
if (Thread.currentThread().isInterrupted()) {
System.out.println("....run()::work::PART B::isInterrupted():" + Thread.currentThread().isInterrupted());
Thread.sleep(2000);
}
}
}
public static void main(String[] args) {
Thread t = new Thread(new GeneralInterrupt());
t.start();
try {
Thread.sleep(3000);
} catch (InterruptedException x) {
}
System.out.println(".main()::interrupting thread t");
t.interrupt();
System.out.println(".main()::leaving");
}
}
Также обратите внимание, что если обе строки «Thread.sleep(2000)» удалены из частей A и B, то вывод будет
....run()::work::PART B::isInterrupted():false
....run()::work::PART B::isInterrupted():false
....run()::work::PART B::isInterrupted():false
....run()::work::PART B::isInterrupted():false
....run()::work::PART A::isInterrupted():true
....run()::work::PART A::isInterrupted():true
....run()::work::PART A::isInterrupted():true
....run()::work::PART A::isInterrupted():true
....run()::work::PART A::isInterrupted():true
Может ли кто-нибудь объяснить, почему метод Thread.sleep() ведет себя таким образом внутри метода work().