2012-01-20 12 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()の終わりを実行する前に、「ねえ、私は終わりだ」言うまで待つことです。 notifyAll()にもかかわらず、wait()は永遠に続きます。

私は

+2

コードには多くのエラーがあります。最も重要なのは、スレッドが1つしかないことです。メインスレッドです。並行処理についてのJavaチュートリアルを読んでください。http://docs.oracle.com/javase/tutorial/essential/concurrency/このチュートリアルのすべてを理解したら、Thread.join()の使用を検討してください。 –

答えて

6

wait()notify()を直接使用するためのものではなく、より良いライブラリは、低レベルの同期に使用されているプリミティブされていませんか得ることはありません。

CountDownLatchなどの上位レベルの並行処理メカニズムを使用する必要があります。 CountDownLatchの値を4に設定するとよいでしょう。各スレッドがcountDown()のラッチのメソッドを呼び出すのを待ってから、await()を呼び出します。

private CountDownLatch rendezvousPoint = new CountDownLatch(4); 

//wait for threads 
rendezvousPoint.await(); 

//do stuff after rendezvous 

//in the other 4 threads: 
rendezvousPoint.countDown(); 
+0

RMIではシリアル化できないので動作しませんので別の方法を見つけなければなりません。しかし、ええ、これはまさに私が必要なものです。どうもありがとう :)。 – deathiop

1

もちろん、クラスAのすべてのインスタンスにはクラスRdvのインスタンスが異なるため、到達できません。あなたはCountDownLatch

2

をRDVを使用する必要が

...私は一つだけ、あなたがしていることに気付いています実際にスレッドを開始していませんか?あなたが待っている4つのスレッドを持つようにしたい場合は

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回実行されなければなりません。

3

オムの使用を検討して、クラスの静的変数として代わりにwait()notify()を自分でいじりの

関連する問題