java - wait(),notify(),notifyAll() T2 start! T2 end! T1 start! 为什么会阻塞
PHP中文网
PHP中文网 2017-04-18 10:53:24
0
2
920
public class Thread04 {
   final Object object = new Object();
Runnable rb4 = new Runnable() {
    public void run(){
        synchronized (object){

                System.out.println("T1 start!");
                try {
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                object.notify();
                System.out.println("T1 end!");
            }
        }
};
Runnable rb5 = new Runnable() {
    public void run(){
        synchronized (object){
            System.out.println("T2 start!");
            object.notify();
            System.out.println("T2 end!");
            }
        }
};
public static void main(String[] args) {
        Thread04 th = new Thread04();
        new Thread(th.rb4).start();
        new Thread(th.rb5).start();
     }
 }
PHP中文网
PHP中文网

认证高级PHP讲师

모든 응답(2)
洪涛

rb5의 object.notify()는 rb4가 아직 잠금을 기다리고 있기 때문에 대기 상태에 진입하지 않은 경우 호출됩니다. 스레드 시작은 자체적으로 즉시 run()을 수행한다는 의미는 아닙니다. 즉, 스레드 이후에 start()하는 스레드의 run()이 먼저 실행될 가능성이 높다는 의미입니다.

迷茫

rb4은 작업 중 object의 객체 잠금을 획득하고 T1 start!을 출력한 후 wait()를 호출합니다. 이 메서드를 사용하면 rb4이 정지되고 잠금이 해제되며 동시에 차단됩니다. 이때 rb5는 잠금을 획득하고 T2 start!을 출력합니다. 그런 다음 object.notify();을 호출합니다. rb4을 실행하려고 했지만 rb5의 잠금이 해제되지 않았으므로 rb4은 여전히 ​​차단되어 있습니다. rb5계속 실행하고 출력합니다T2 end!. rb5작업이 완료되고 잠금이 해제되며 rb4작업이 출력됩니다T1 end!.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!