Domanda

Ho un codice di registrazione che deve essere eseguita dopo vengono eseguite tutte le Threadss.

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() si chiama non appena vengono avviati T1 e T2.

È stato utile?

Soluzione

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

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

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

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

Altri suggerimenti

In aggiunta alla soluzione join () c'è anche qualcosa chiamato CountDownLatch nella biblioteca java.util.concurrent. Esso consente di inizializzare a un certo numero e poi attendere fino a quando è stato colpito il numero di volte specificato.

Un 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()

Se si esegue il codice dal thread principale, tenere a mente che causerà l'interfaccia utente per appendere fino a quando entrambi i thread completi. Questo potrebbe non essere l'effetto desiderato.

Al contrario, si potrebbe prendere in considerazione una costruzione in cui ogni filo sincronizza sopra il vostro oggetto Logger ed eseguire chiamate ad esso all'interno di tale costrutto. Dal momento che non so che cosa si sta cercando di realizzare specificamente, l'altra soluzione è ciò che Joachim suggerito, solo mettendo il codice all'interno di un thread.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top