2011-07-06 12 views
5

Chcę zaimplementować niestandardową barierę Java. Nie chcę korzystać z CyclicBarrier class.Implementacja niestandardowej bariery Java

Wszystkie wątki spotykają się we wspólnym punkcie. Gwinty przetwarzają się tylko wtedy, gdy wszystkie nici dotarły do ​​bariery.

Chcę użyć metod wait/notify/notifyAll do wdrożenia bariery.

Więc to co wymyśliłem

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(); 
    } 
} 

Ale ja naprawdę nie rozumiem jak to osiągnąć, że pewna liczba wątków są zatrzymane, aż wszystkie wątki przyjechał. Czy możliwe jest zaimplementowanie bariery za pomocą tylko czekania/powiadamiania/powiadamiania wszystkich?

+2

Czy to zadanie domowe? A może chcesz użyć CyclicBarrier? – meriton

+0

Po prostu próbuję dostać się do wątków Java i współbieżność i brzmi to być interesujące ćwiczenie do nauki od –

Odpowiedz

3

Sortuj pracy domowej, więc daję tylko podpowiedź:

chcesz wszystkie wątki postępować gdy threadNumber wątki czekają. Jest to odpowiednik pierwszych wątków threadNumber - 1 czekających na dostarczenie kolejnego wątku z threadNumber. Jednym ze sposobów jest policzenie liczby wątków i zrobienie czegoś specjalnego po pojawieniu się wątku threadNumber.

0

Dodatkowa wskazówka dotycząca szczegółów Java: wątek zablokowany na wait() może być budzony fałszywie; patrz Object.wait() javadocs.

Aby tolerować fałszywe wybudzenia, musisz mieć pętlę while, w której prosta logika wymaga tylko sprawdzenia if lub niewidomego wait().

Powiązane problemy