/ / Najlepsza praktyka podczas oczekiwania na wiele wątków - czas, liczba czy coś innego? - Java, wielowątkowość

Najlepsza praktyka podczas oczekiwania na wiele wątków - czas, liczba czy coś innego? - Java, wielowątkowość

Moja aplikacja, podczas wykonywania, będzie zawierała wiele wątków (w tym przykładzie 7) wykonujących samodzielną pracę. Jednak co jakiś czas wątki będą musiały synchronizować swoje dane.

Zostanie to wykonane przez wątki wywołujące obiekt DataSynchronizer, do którego wszystkie mają odniesienie.

Mój pomysł na przepływ w tej klasie wygląda następująco:

public class DataSynchronizer {

public void synchronizeData(List<Data> threadData) {
// Wait for all 7 threads to call this method

// When all 7 are here, hold them here & do work using one of the threads
// or a new anonymous thread

// Release the threads & let them continue their independent work
}
}

Moje pytanie brzmi: jaki jest najlepszy sposób, aby "zaczekać na wszystkie wątki x" przed wykonaniem synchronizacji?

Wiem, że wszystkie wątki wywołają metodę synchronizeData w ciągu 1, maksymalnie 2 sekund od siebie.

Ja też,

1) Poczekaj 2s po pierwszym wątku wywołaj metodę i załóż, że wszystkie wątki również już przybyły? lub

2) Trzymaj liczbę, aby upewnić się, że wszystkie aktywne wątki przybyły? (Aplikacja będzie czekać na wieczność, jeśli wątek ulegnie awarii tuż przed wywołaniem metody)

3) Licznik + limit czasu?

4) ???

Odpowiedzi:

2 dla odpowiedzi № 1

Oto co CyclicBarrier jest dla. Pozwala na zdefiniowanie miejsc, w których wątki będą czekać, aż wszystkie pojawią się, a następnie opcjonalnie uruchom Runnable aby wykonać synchronizację lub inną podobną rzecz.


2 dla odpowiedzi nr 2

Myślę, że potrzebujesz java.util.concurrent.CyclicBarrier.


1 dla odpowiedzi nr 3
  1. Założenie i wątki to bardzo ryzykowne podejście.
  2. Jak zły czeka na wieczność? Brzmi niewygodnie dla mnie.
  3. Jeśli trafisz w limit czasu, możesz zrobić coś pożytecznego? Awaria programu, ponowne uruchomienie błędnego wątku, założenie czegoś o tym, co robi?

Pytania uzupełniające:

  • Co się dzieje, gdy wątek nie uczestniczy w synchronizacji?
  • Co się stanie, jeśli synchronizacja się opóźni?
  • Czy twoja metoda powinna wskazywać jeden wątek od drugiego, czy może to tylko 7 wymiennych pracowników?