Bariery wątków - klasa CyclicBarieer

Wstrzymywanie wykonania wątków - klasa CyclicBarrier

Czasami wyniki działania wielu wątków powinny być spójną całością, dlatego zwykłe callback'i przestają nam wystarczać. Problem polega na tym, aby wątek, gdy kończy swoje wykonanie wstrzymał się z upublicznieniem wyników do momentu aż wszystkie wątki pracujące na wspólny wynik zakończą wykonywanie swoich zadań. Z pomocą przychodzi wtedy klasa CyclicBarrier.

Całe użycie bariery to po prostu wywołanie na jej obiekcie metody await(). Bariera wstrzymuje wykonanie wątku, który wywołał await() do momentu aż wkazana ilość wątków wywoła await(). Stąd wziął się argument konstruktora, który określa ilość wątków, które ma zablokować bariera.

Posłużę się przykładem z poprzedniego artykułu o Callable i FutureTask. Do ciała mojej klasy implementującej Callable dodam jednak jeszcze jedną linijkę:

Wywołuję 5 wątków opartych na klasie Task1 (tak jak w poprzednim artykule). Porównajmy więc wyniki. Po prawej znajduje się wynik wykonania programu z poprzedniego artykułu, a po lewej nowego, który wykorzystuje bariery.

 

Ten artykuł jest elementem poniższych kursów: