2016-08-09 46 views
-1

Ich möchte eine Aufgabe ausführen, die einen Timer enthält, der eine andere Aufgabe ausführt. Ich muss warten, bis diese Unteraufgabe beendet ist, bevor ich eine andere "Elternaufgabe" ausführen kann.Java Multithreading - Planen Sie eine Aufgabe jedes Mal, wenn die Aufgabe ihren Job beendet

Also wie kann ich die Hauptaufgabe warten, bis ihre Unteraufgaben beendet sind, bevor Sie eine andere Aufgabe aufnehmen?

Ich dachte, es mit boolean IstFertig in jeder Aufgabe anmelde aber im nicht sicher, ob sein richtigen

+0

Bitte Codebeispiel liefern: http://stackoverflow.com/help/how-to-ask –

+0

Wenn Sie Aufgaben "abschicken", erhalten Sie eine "Zukunft", die Sie in eine Liste eintragen können. Sie können dann 'get()' auf jedem aufrufen, der zurückkommt, wenn sie fertig sind. – Fildor

Antwort

0

Sie ein CountDownLatch in dem übergeordneten Thread verwenden kann, die warten, bis das Kind Arbeit es ist beendet und ruft die Count-down() Methode, damit der übergeordnete Thread seine Arbeit fortsetzen kann. Sie können mehrere untergeordnete Elemente haben, und Sie können den CountDownLatch-Wert so anpassen, dass er ihnen entspricht.

Ich würde nicht empfehlen, eine volatile Variable verwenden, da Sie kontinuierlich den übergeordneten Thread in den Ruhezustand versetzen müssen und überprüfen, ob die Variable geändert hat, nachdem es aufwacht.

0

Um für eine Reihe von Aufgaben warten zu beenden: invokeAll

// Assume we have an ExecutorService "pool" and tl is list of tasks 
List<Future<SomeType>> results = pool.invokeAll(tl); // will block until all tasks in tl are completed 

Oder

// Assume we have an ExecutorService "pool" and N is the count of tasks 
List<Future<SomeType>> batch = new ArrayList<>(N); 

for(int i = 0; i < N; i++){ 
    batch.add(pool.submit(new Task(i))); 
} 

for(Future fut : batch) fut.get(); 
/* get will block until the task is done. 
* If it is already done it will return immediately. 
* So if all futures in the list return from get, all tasks are done. 
*/