Frage

Ich habe einen Logging-Code, der ausgeführt werden muss, nachdem alle Threadss ausgeführt werden.

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

doLogging();

Gibt es eine Möglichkeit doLogging() nur nachdem beide Threads auszuführen sind mit ihrer Verarbeitung durchgeführt. Nun, da doLogging() sobald T1 und T2 genannt gestartet werden.

War es hilfreich?

Lösung

Just join() alle Themen vor Ihrem doLogging() Aufruf:

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

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

Beachten Sie, dass die Reihenfolge der Anrufe join() spielt keine Rolle, wenn Sie für alle Ihre Threads warten wollen.

Andere Tipps

Neben der join () Lösung gibt es auch etwas CountDownLatch in der java.util.concurrent Bibliothek aufgerufen. Es ermöglicht Ihnen, es auf eine bestimmte Anzahl zu initialisieren und dann warten, bis er die angegebene Anzahl der Male getroffen wurde.

Einfaches Beispiel:

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

latch.await();

Die Verriegelung muss explizit von den Arbeitsthreads getroffen werden, um dies allerdings zu arbeiten:

latch.countDown()

Wenn Sie den Code aus dem Haupt-Thread ausgeführt werden, bedenken Sie, dass es wird die UI verursacht abgeschlossen, bis beiden Fäden hängen. Dies kann nicht die gewünschte Wirkung.

Stattdessen könnte man eine Konstruktion überlegen, wo jeder Thread über Ihr Logger Objekt synchronisiert und führt Gespräche, um es innerhalb dieses Konstrukts. Da ich weiß nicht, was Sie speziell die andere Lösung zu erreichen, versuchen, ist das, was Joachim vorgeschlagen, nur den Code innerhalb eines Threads platzieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top