>  Q&A  >  본문

java - wait(),notify(),notifyAll() T2 start! T2 end! T1 start! 为什么会阻塞

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中文网2717일 전889

모든 응답(2)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-18 10:55:24

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

    회신하다
    0
  • 迷茫

    迷茫2017-04-18 10:55:24

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

    회신하다
    0
  • 취소회신하다