2013-09-26 7 views
2

ThreadB가 ThreadB에서 통지를받는 이유는 ThreadB가 완전히 완료된 경우에만 찾을 수 없습니다. 만약 내가 알리미() ThreadA 어쨌든 알림을 가져옵니다.스레드 알림이 작동하지 않습니다.

ThreadB는 작업이 끝나면 자동으로 알림을 보냅니 까?

ThreadB가 ThreadA를 정시에 알려주지 않는 이유는 무엇입니까?

class ThreadA { 
     public static void main(String [] args) { 
     ThreadB b = new ThreadB(); 

     b.start(); 

     synchronized(b) 
     { 

      try { 
       System.out.println("Waiting for b to complete..."); 
       b.wait(); 
       System.out.println("waiting done"); 
       } catch (InterruptedException e) {} 

      System.out.println("Total is: " + b.total); 

     } 
    } 
    } 





class ThreadB extends Thread { 
    int total=0; 
    public void run() { 
     synchronized(this) 
     { 


      for(int i=0;i<10;i++) 
      { 
       System.out.println(Thread.currentThread().getName()+" "+ Integer.toString(i)); 
       total += i; 
      } 


      notify(); 
      System.out.println("notify done"); 

      for(int i=0;i<100;i++) 
      { 
       System.out.println(Thread.currentThread().getName()+" "+ Integer.toString(i)); 
       total += i; 
      } 

     } 
    } 
    } 

출력 :

Waiting for b to complete... 
Thread-0 0 
Thread-0 1 
Thread-0 2 
Thread-0 3 
Thread-0 4 
Thread-0 5 
Thread-0 6 
Thread-0 7 
Thread-0 8 
Thread-0 9 
notify done 
Thread-0 0 
Thread-0 1 
Thread-0 2 
Thread-0 3 
Thread-0 4 
Thread-0 5 
Thread-0 6 
Thread-0 7 
Thread-0 8 
Thread-0 9 
Thread-0 10 
Thread-0 11 
Thread-0 12 
Thread-0 13 
Thread-0 14 
Thread-0 15 
Thread-0 16 
Thread-0 17 
Thread-0 18 
Thread-0 19 
waiting done 
Total is: 235 

추가 질문 - 총 출력 235 왜?

답변

5

먼저 으로 지정하십시오. Thread 개체를 사용하지 마십시오. Threadwaitnotify 자체를 사용하므로 쉽게 혼란스러운 신호로 끝날 수 있습니다. 끝이 ThreadB.run 전화 notify() 있지만, 그것은 다음 synchronized 블록 내 을 계속 갈 수 있다는 것입니다 때까지

이 표시되지 않는 이유는 "완료 대기". wait() 메서드는 모니터를 다시 가져올 때까지 반환되지 않습니다. 모니터가 동기화 된 블록의 끝까지 수행 할 수 없습니다.

총계는 단순히 모든 숫자를 합한 합계입니다. 실제로는 두 번째 한계 인 20, 10이 아닌 것처럼 보입니다. (0 + 1 + 2 + ... 9) + (0 + 1 + 2 + ... 19)는 235입니다. 왜 다른 것이 기대되는지는 명확하지 않습니다.

관련 문제