Java 스레드가 interrupted
인지 여부를 판별하려고 시도하고 있습니다. 지금까지 대답은 "아니오"인 것 같습니다 ...종료 된 Java 스레드의 중단 상태를 얻는 방법은 무엇입니까?
run()
의 끝에서 떨어지기 직전에 Thread.currentThread().isInterrupted()
은 true
입니다.
그러나 join()
대상 스레드를 보내고 후 우리는 항상 false
를 얻을 :
import static org.junit.Assert.*;
import org.junit.Test;
public class ThreadDeadInterruptStateTest {
@Test public void test() {
Thread a = new Thread(new Runnable() {
@Override public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// 2x to show that check doesn't reset status
assertTrue("Interrupt status from a 1: ", // pass
Thread.currentThread().isInterrupted());
assertTrue("Interrupt status from a 2: ", // pass
Thread.currentThread().isInterrupted());
}
}});
a.start();
a.interrupt();
try {
a.join();
assertEquals("Thread state", a.getState(),
Thread.State.TERMINATED); // pass
assertTrue("Interrupt status after join: ",
a.isInterrupted()); // Still FAILs :-(
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
public static void main(String[] args) {
new ThreadDeadInterruptStateTest().test();
}
}
오타가 수정되었습니다. 아직도 체포 됐어. – DouglasDD
상태를 지우는 것은'join' 호출 인 것 같습니다 : http://ideone.com/2s0x6H. 그러나 그 행동이 문서화 된 곳을 나는 볼 수 없다. –
투표가 재개되었지만이 속임수로 즉시 재발행됩니다. http://stackoverflow.com/questions/10401947/methods-that-clear-the-thread-interrupt-flag –