Kilka wątków w jednej pętli, synchronizacja

0

Witam,
Jestem świeży w współbierzności i natrafiłem na pewien problem.

Otóż w metodzie run() mam pętlę, która musi się wykonać x razy ( różne z każdym ponownym uruchomieniem programu ). Startuję 5 wątków, i każdy z nich korzysta z tej pętli w metodzie run(). I teraz moje pytanie, w jaki sposób mam to zrobić, aby po wykonaniu x razy, wszystkie wątki przestały pracować i pętla nigdy więcej nie była wykonana? Próbowałem to zrobić na takiej zasadzie, że w pętli zmienna jest statyczna, tak aby wszystkie wątki korzystały z tej samej, ale to nie podziałało. Prosiłbym o przykład takiej pętli. Dzięki !

0

To co piszesz brzmi jak bełkot, jakbyś nie wiedział co chcesz osiągnąć, więc może spytam: Jaki efekt chcesz osiągnąć?

0

Efekt : Pętla ma być wykonana np 20 razy łącznie, bez znaczenia ile razy przez który wątek. Działa 5 wątków, w momencie kiedy pętla wykona się 20 raz wątki mają umrzeć.

2

Poza pętlą musisz mieć coś co pamięta ilość wykonań pętli (np zmienną integer). Musisz jednak pamiętać że wszystkie zmienne modyfikowane/odczytywane z więcej niż jednego wątku muszą być synchronizowane (albo w jakiś inny sposób zabezpieczone przed jednoczesną modyfikacją).

Możesz się zainteresować słówkiem synchronized w javie, jeśli jesteś ambitny, albo użyć AtomicInteger.

PS: Jesteś pewien że potrzebujesz aż 5 watków?

1

to podchodzisz do zadania od d** strony. Masz jakąś pulę wątków (np. 5), które działają jednocześnie. Każdy wątek coś robi i po zakończeniu generuje "tik" twojej pętli. Musisz zliczać te tiki, i po każdym skończeniu wątku liczysz ile tików masz już zrobionych do tego dodajesz ile wątków jest w trakcie robienia tiku i jeśli suma jest mniejsza od docelowej liczby tików to odpalasz kolejne wątki aż do wyczerpania puli.

0

@abrakadaber: można też nieco prościej – niech każdy wątek generuje "tik" na dzień dobry, wtedy wystarczy sprawdzać sam licznik, już bez sumowania jego wartości z liczbą aktywnych wątków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1