Maison >Java >javaDidacticiel >Comment puis-je déterminer efficacement l'état d'achèvement de plusieurs threads ?

Comment puis-je déterminer efficacement l'état d'achèvement de plusieurs threads ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-28 03:31:10372parcourir

How Can I Efficiently Determine the Completion Status of Multiple Threads?

Comment vérifier l'achèvement des threads dans plusieurs threads

Lors de l'exécution de plusieurs threads simultanément, il devient crucial de déterminer leur état d'achèvement. Cet article explore différentes méthodes pour y parvenir.

1. Thread.join() : Blocage d'attente

La méthode Thread.join() permet au thread principal de se bloquer jusqu'à ce qu'un thread spécifique termine son exécution. Cette approche, bien que simple, peut nuire à la réactivité globale de votre application.

2. Thread.isAlive() : Polling Check

Thread.isAlive() vérifie périodiquement si un thread est toujours en cours d'exécution. Cependant, cette approche est généralement déconseillée en raison de son inefficacité potentielle et de sa consommation de ressources.

3. UncaughtExceptionHandler :

Une approche peu orthodoxe consiste à configurer des gestionnaires d'exceptions non interceptés. Lorsqu'un thread se termine, il peut être programmé pour lever une exception, déclenchant le gestionnaire de votre objet.

4. Verrous et synchroniseurs :

L'exploitation des verrous ou des synchroniseurs peut fournir un mécanisme plus synchronisé pour gérer l'exécution et l'achèvement des threads.

5. Notification basée sur l'auditeur :

Une solution plus élégante consiste à créer une interface d'écoute et à implémenter des classes qui étendent NotifyingThread. Ces fils de discussion informent automatiquement les auditeurs une fois terminés, permettant au fil de discussion principal de recevoir des notifications et de répondre en conséquence.

Mise en œuvre de la notification basée sur les auditeurs :

Pour mettre en œuvre cette approche, commencez en définissant une interface d'écoute :

public interface ThreadCompleteListener {
    void notifyOfThreadComplete(final Thread thread);
}

Ensuite, créez une classe abstraite, NotifyingThread, qui étend Sujet :

public abstract class NotifyingThread extends Thread {
    private final Set<ThreadCompleteListener> listeners
                   = new CopyOnWriteArraySet<>();
}

La méthode doRun() doit être implémentée à la place de run() dans vos threads spécifiques. Une fois terminés, ils avertiront tous les auditeurs enregistrés.

Enfin, modifiez la classe principale qui démarre les threads pour implémenter ThreadCompleteListener. Après avoir créé chaque fil de discussion, ajoutez-le à la liste des auditeurs :

NotifyingThread thread1 = new OneOfYourThreads();
thread1.addListener(this); // Add main class as a listener
thread1.start();           // Start the thread

Votre méthode notifyOfThreadComplete sera invoquée chaque fois qu'un fil de discussion se termine ou plante, fournissant l'instance de fil terminée.

Remarque : L'implémentation de Runnable plutôt que l'extension de Thread est généralement préférable pour créer de nouveaux threads.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn