/ / Meilleure pratique lorsque vous attendez plusieurs threads - le temps, le compte ou autre chose? - java, multithreading

Meilleure pratique lorsque vous attendez plusieurs threads - le temps, le compte ou autre chose? - java, multithreading

Pendant l'exécution, mon application contiendra plusieurs threads (dans cet exemple 7) effectuant un travail indépendant. Cependant, de temps en temps, les threads devront synchroniser leurs données.

Cela se fera par les threads appelant l'objet DataSynchronizer auquel ils ont tous une référence.

Mon idée de flux dans cette classe ressemble à ceci:

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
}
}

Ma question est la suivante: quel est le meilleur moyen pour moi d’attendre tous les x threads avant de faire le travail de synchronisation?

Je sais que tous les threads appellent la méthode synchronizeData dans les 1, 2 secondes maximum les uns des autres.

Moi aussi,

1) Attendez 2 secondes après que le premier thread appelle la méthode et supposez que tous les threads sont également arrivés? ou

2) Gardez un compte pour vous assurer que tous les threads actifs sont arrivés? (App attendra l'éternité si un thread se bloque juste avant d'appeler la méthode)

3) Count + timeout?

4) ???

Réponses:

2 pour la réponse № 1

C'est ce que CyclicBarrier est pour. Il vous permet de définir les emplacements où les threads attendent jusqu'à ce que tous arrivent, puis exécutent éventuellement un Runnable effectuer une synchronisation ou autre chose du genre.


2 pour la réponse № 2

Je pense que vous avez besoin d'un java.util.concurrent.CyclicBarrier.


1 pour la réponse № 3
  1. Supposer et threads est une approche très risquée.
  2. À quel point l'attente d'une éternité est-elle mauvaise? Cela me semble incommode.
  3. Si vous atteignez le délai d'attente, pouvez-vous faire quelque chose d'utile? Crash le programme, redémarrer le thread errant, assumer quelque chose sur ce qu'il fait?

Questions de suivi:

  • Que se passe-t-il si un thread ne participe pas à la synchronisation?
  • Que se passe-t-il si la synchronisation est en retard?
  • Votre méthode devrait-elle distinguer un fil d'un autre ou ne sont-elles que 7 ouvrières interchangeables?