/ / Best Practice beim Warten auf mehrere Threads - Zeit, Anzahl oder etwas anderes? - Java, Multithreading

Best Practice beim Warten auf mehrere Threads - Zeit, Anzahl oder etwas anderes? - Java, Multithreading

Meine Anwendung enthält zur Laufzeit mehrere Threads (in diesem Beispiel 7), die selbstständig arbeiten. Aber ab und zu müssen die Threads ihre Daten synchronisieren.

Dies wird von den Threads ausgeführt, die das DataSynchronizer-Objekt aufrufen, auf das sie alle verweisen.

Meine Idee für Flow in dieser Klasse sieht so aus:

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

Meine Frage ist, was ist der beste Weg für mich, auf alle x-Threads zu warten, bevor ich mit der Synchronisation arbeite?

Ich weiß, dass alle Threads die SynchronizeData-Methode innerhalb 1, maximal 2 Sekunden voneinander aufrufen werden.

Ich auch,

1) Warten Sie 2s nach dem ersten Thread die Methode aufrufen und annehmen, dass alle Threads nun auch angekommen sind? oder

2) Behalte einen Zähler, um sicherzustellen, dass alle aktiven Threads angekommen sind? (App wird auf die Ewigkeit warten, wenn ein Thread kurz vor dem Aufruf der Methode abstürzt)

3) Anzahl + Zeitüberschreitung?

4) ???

Antworten:

2 für die Antwort № 1

Das ist was a Zyklische Barriere ist für. Es ermöglicht Ihnen, Punkte zu definieren, an denen Threads warten, bis alle ankommen, und dann optional a auszuführen Runnable um eine Synchronisation oder ähnliches durchzuführen.


2 für die Antwort № 2

Ich denke du brauchst eine java.util.concurrent.CyclicBarrier.


1 für die Antwort № 3
  1. Angenommen und Threads ist ein sehr riskantes Vorgehen.
  2. Wie schlimm wartet auf eine Ewigkeit? Klingt für mich unbequem.
  3. Wenn Sie die Zeitüberschreitung erreichen, können Sie etwas Nützliches tun? Crash das Programm, starten Sie den fehlerhaften Thread neu, nehmen Sie etwas an, was es tut?

Folgefragen:

  • Was passiert, wenn ein Thread nicht an der Synchronisation teilnimmt?
  • Was passiert, wenn die Synchronisierung zu spät ist?
  • Sollte deine Methode einen Thread von einem anderen unterscheiden oder sind es nur 7 austauschbare Arbeiter?