2012-01-20 2 views
2

wait()notify()을 사용하는 데 문제가 있습니다. rendez-vous의 종류가 있어야합니다. 여기 작동하지 않는 Java의 Rendez-Vous 종류

코드의 작은 조각에서 일 :

class A { 
    private Rdv r; 

    public A(Rdv r) { 
     this.r = r; 
    } 

    public void someMethod() { 
     synchronized(r) { 
      r.wait(); 
     } 

     // ***** some stuff never reached***** 
    } 
} 

class Rdv { 
    private int added; 
    private int limit; 

    public Rdv(int limit) { 
     this.added = 0; 
     this.limit = limit; 
    } 

    public void add() { 
     this.added++; 

     if(this.added == this.limit) { 
      synchronized(this) { 
       this.notifyAll(); 
      } 
     } 
    } 
} 

class Main { 
    public static void main(String[] args) { 
     Rdv rdv = new Rdv(4); 

     new Runnable() { 
      public void run() { 
       A a = new A(rdv); 
       a.someMethod(); 
      } 
     }.run(); 

     rdv.add(); 
     rdv.add(); 
     rdv.add(); 
     rdv.add(); 
    } 
} 

아이디어는 4 개 스레드가 someMethod()의 끝을 실행하기 전에 "이봐, 난 끝났어요"말할 때까지 기다리는 것입니다. 그러나 wait()notifyAll()에도 불구하고 영원히 지속됩니다.

나는

+2

코드에 많은 오류가 있습니다. 가장 중요한 것은 하나의 스레드 즉 주 스레드 만 가지고 있다는 것입니다. 동시성에 대한 Java 자습서를 읽으십시오. http://docs.oracle.com/javase/tutorial/essential/concurrency/이 자습서의 모든 내용을 이해했으면 Thread.join() 사용을 고려하십시오. –

답변

6

wait()notify()가 직접 사용할 수 의미가 아니라 더 나은 라이브러리는 낮은 수준의 동기화를 위해 사용하는 기본 요소가되지 않습니다 어떻게하지 않습니다.

보다 높은 수준의 동시성 메커니즘 (예 : CountDownLatch)을 사용해야합니다. CountDownLatch의 값을 4로 설정하려고합니다. 각 스레드가 래치의 countDown() 메서드를 호출하고 대기하려는 스레드가 await()이라고합니다.

+0

글쎄, RMI에서는 작동하지 않는다. Serializable이 아니기 때문에 다른 방법을 찾아야했다. 하지만 그래,이게 내가 필요한거야. 고마워. :). – deathiop

1

물론 클래스 A의 모든 인스턴스에는 클래스 Rdv의 다른 인스턴스가 있기 때문에 물론 도달하지 않습니다.

당신은 내가 당신이라는 것을 알아 차리지 유일한 사람입니다 대신 wait()notify() 자신을 장난의

3

음을 사용하는 것이 클래스의 정적 변수로 RDV를 사용할 필요가 실제로 모든 스레드를 시작하지 않습니까?

new Runnable() { 
     public void run() { 
      A a = new A(rdv); 
      a.someMethod(); 
     } 
    }.run(); 

Thread t = new Thread(
    new Runnable() { 
     public void run() { 
      A a = new A(rdv); 
      a.someMethod(); 
     } 
    }); 
t.start(); 

해야합니다 그리고 당신은 대기 4 개 스레드를하려면이 4 번 실행해야합니다.