2011-07-06 99 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來實現屏障?

+2

這功課嗎?或者你爲什麼不想使用CyclicBarrier? – meriton

+0

我只是試圖進入Java線程和併發性,這聽起來是一個有趣的練習,以學習 –

回答

3

排序功課,所以我只給一個提示:

你希望所有的線程時threadNumber線程都在等待出發。這相當於第一個threadNumber - 1線程正在等待第threadNumber個線程到達。一種方法是計算線程的數量,並在第一個線程到達時執行一些特殊的操作。

0

與Java細節相關的其他提示:在wait()上被阻止的線程可能被虛假喚醒;請參閱Object.wait() javadocs

要容忍虛假喚醒,您需要有一個while循環,其中簡單的邏輯只需要一個if檢查或一個盲人wait()