2009-09-29 6 views
6

Ho un codice di registrazione che deve essere eseguito dopo che tutti gli Threads vengono eseguiti.Come eseguire una parte di codice solo dopo aver completato tutti i thread

Thread t1 = new MyThread(); 
Thread t2 = new MyThread(); 
t1.run(); 
t2.run(); 

doLogging(); 

C'è un modo per eseguire doLogging() solo dopo che entrambi i fili sono fatti con la loro elaborazione. Ora che doLogging() viene chiamato non appena vengono avviati t1 e t2.

+2

Va sottolineato che, poiché si sta chiamando corsa al posto di partenza stai già ottenendo il comportamento desiderato. –

risposta

19

soli join() tutte le discussioni prima della doLogging() chiamata:

t1.join(); 
t2.join(); 

// the following line will be executed when both threads are done 
doLogging(); 

Nota che l'ordine di join() chiamate non importa se si desidera attendere per tutte le vostre discussioni.

+0

Grazie. Ciò ha funzionato :) – shafi

+0

Si noti che se si utilizza Java 1.5 o versioni successive, il nuovo java.util.concurrent deve essere preferito alla programmazione di thread di basso livello (vedere la risposta di Gregory Mostizky). –

+0

@Jim: con Java 1.5 o successivo non userei nemmeno un CountDownLatch per una cosa del genere, ma un semplice Executor. –

0

Se si sta eseguendo il codice dal thread principale, tenere presente che causerà l'interruzione dell'interfaccia utente fino al completamento di entrambi i thread. Questo potrebbe non essere l'effetto desiderato.

Invece, si potrebbe prendere in considerazione una costruzione in cui ogni thread si sincronizza sull'oggetto Logger ed esegue chiamate all'interno di tale costrutto. Dal momento che non so cosa stai cercando in concreto di realizzare, l'altra soluzione è quella suggerita da Joachim, inserendo solo quel codice all'interno di un thread.

6

Oltre alla soluzione join() esiste anche qualcosa chiamato CountDownLatch nella libreria java.util.concurrent. Ti consente di inizializzarlo su un certo numero e quindi attendere fino a quando non viene raggiunto il numero specificato di volte.

semplice esempio:

CountDownLatch latch = new CountDownLatch(NUMBER_OF_THREADS); 
for(int i=0; i<NUMBER_OF_THREADS;i++) 
    new Thread(myCode).start(); 

latch.await(); 

il fermo deve essere esplicitamente colpito da thread di lavoro per far funzionare tutto questo però:

latch.countDown() 
+0

+1 per java.util.concurrent. Questa nuova funzione rende superflua la programmazione di thread di basso livello in Java. –