결코 멈추지 않아야하는 테스트 앱을 작성했습니다. t.wait()
(t
은 Thread
개체 임)을 발행하지만 알림을 요청하지 않습니다. 왜이 코드가 끝날까요? t
에서 동기화되는 주 스레드에도 불구하고 생성 된 스레드가 실행되므로이 개체를 잠그지 않습니다.Java는 대기중인 스레드에 암시 적으로 통지합니까?
public class ThreadWait {
public static void main(String sArgs[]) throws InterruptedException {
System.out.println("hello");
Thread t = new MyThread();
synchronized (t) {
t.start();
Thread.sleep(5000);
t.wait();
java.lang.System.out.println("main done");
}
}
}
class MyThread extends Thread {
public void run() {
for (int i = 1; i <= 5; i++) {
java.lang.System.out.println("" + i);
try {
Thread.sleep(500);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
그 결과 메인 스레드가 5 초 동안 대기하고이 시간 동안 작업자가 출력을 제공합니다. 그런 다음 5 초가 끝나면 프로그램이 종료됩니다. t.wait()
기다리지 않습니다. 주 스레드가 5 초 동안 잠을 자지 않으면 (이 줄 주석 처리), t.wait()
은 실제로 작업자가 완료 될 때까지 대기합니다. 물론 join()
은 여기에서 사용하는 방법이지만, 예기치 않게 wait()
은 join()
과 동일한 작업을 수행합니다. 왜?
아마도 JVM에서는 하나의 스레드 만 실행 중이기 때문에 주 스레드에 알릴 기회가 없으며 교착 상태를 해결할 수도 있습니다. 이것이 사실이라면 문서화 된 기능입니까? 나는 Windows XP에서 테스트하고 있습니다
,
1 초 또는 2 초만 자면 어떻게됩니까? 그렇다면 주 스레드가 스레드 t가 실행을 끝내기를 기다릴 것입니다. – Renato