2011-07-06 8 views
5

私はカスタムjavaバリアを実装したいと思います。私はCyclicBarrier classを使用したくありません。カスタムjavaバリアを実装する

したがって、すべてのスレッドは共通点で会合します。スレッドは、すべてのスレッドがバリアに到着した場合にのみ実行されます。

障壁を実装するためにwait/notify/notifyAllメソッドを使用したいと思います。

だから、これは私が

public class Barrier{ 

    private final int threadNumber; 

    public Barrier(int pThreadNumber){ 
     this.threadNumber = pThreadNumber; 
    } 

    public synchronized void barrier(){ 
     wait(); 
    } 

    public synchronized void releaseBarrier(){ 
     notifyAll(); 
    } 

    public synchronized void releaseThread(){ 
     notify(); 
    } 
} 

思い付いたものです。しかし、私は本当にすべてのスレッドが到着するまでのスレッドの一定数が停止していることを実現する方法を理解していません。 wait/notify/notify allだけを使用してバリアを実装することは可能ですか?

あなたはthreadNumberスレッドが待機しているとき、すべてのスレッドが続行したい:

+2

この宿題はありますか?またはCyclicBarrierを使用したいのはなぜですか? – meriton

+0

私はちょうどJavaスレッドと並行性を取得しようとすると、これは興味深い練習することを学ぶ –

答えて

3

宿題の並び替えは、私は唯一のヒントを与えています。これは、threadNumber番目のスレッドが到着するのを待っている最初のthreadNumber - 1スレッドと同じです。 1つの方法はスレッドの数をカウントし、threadNumber番目のスレッドが到着したら特別な処理を行うことです。

0

Javaの詳細に関連する追加のヒント:wait()でブロックされているスレッドが誤って起動する可能性があります。 Object.wait() javadocsを参照してください。

疑似ウェークアップを許容するには、単純ロジックではifチェックまたはブラインドwait()のみが必要なループwhileループが必要です。

関連する問題