Cela n'utilise pas les événements, mais est juste un des je suis sûr que beaucoup de façons d'y parvenir. Mise en garde rapide: pour que cela fonctionne, vous devez lancer votre Runnable dans un objet Thread, ou modifier votre interface pour avoir une sorte de méthode isStopped() sur votre Runnable, qui retournera si votre Runnable était toujours en cours d'exécution.
Vous pouvez faire en sorte que le thread parent conserve la trace de tous ses threads enfants dans une liste. Lorsqu'un thread enfant se termine, placez la valeur calculée dans un champ, disons, result, et créez une méthode appelée getResult().
Demandez au thread parent de parcourir régulièrement la liste et de vérifier si le thread s'est arrêté. Si vous lancez votre Runnable sur un objet Thread, il existe une méthode appelée isAlive() pour savoir si un thread s'est arrêté. Si c'est le cas, appelez getResult() et faites ce que vous voulez.
Dans le fil parent, vous pouvez le faire:
Boolean running = true;
while (running) {
//iterate through list
//if stopped, get value and do whatever
//if all the child threads are stopped, stop this thread and do whatever
Thread.sleep(1000); //makes this parent thread pause for 1 second before stopping again
}
Vous pouvez vous joindre à un fil, mais qui bloque jusqu'à ce que le fil est fini. L'autre option, si vous pouvez faire en sorte que votre code utilise le framework Executor, est de faire vos autres tâches Runnables à la place. Ensuite, vous surchargez la méthode 'done' de la classe' FutureTask' (via une sous-classe que vous écrivez) pour signaler la fin de votre tâche. –
@Chris Jester-Young: Cela devrait être une réponse, pas un commentaire. –
@MalcomTucker Vous devriez utiliser un CoutnDownLatch à cette fin ... voir ma réponse pour plus de détails. – Kiril