Maison > Java > javaDidacticiel > le corps du texte

Pourquoi l'appel de « sleep() » sur le fil de répartition d'événements gèle-t-il l'interface graphique ?

Patricia Arquette
Libérer: 2024-11-03 13:39:03
original
425 Les gens l'ont consulté

Why Does Calling `sleep()` on the Event Dispatch Thread Freeze the GUI?

Utilisation de sleep() pour un seul thread

En Java, wait() et sleep() sont utilisés pour gérer la synchronisation des threads. Cependant, lorsque vous essayez d'utiliser sleep() sur un seul thread tout en en exécutant d'autres, un problème peut survenir.

Problème :

Lors de l'appel de sleep() sur un thread , les deux threads semblent suspendre l'exécution pendant la durée spécifiée. Pourquoi ce comportement se produit-il ?

Réponse :

Lorsque vous travaillez avec les interfaces graphiques Swing, un thread unique distinct du thread principal et des autres est responsable de sa création. Ce fil est connu sous le nom de fil de répartition d'événements (EDT). Si sleep() est invoqué sur EDT, il arrête l'exécution jusqu'à ce que l'appel soit terminé.

Étant donné que le traitement des événements de l'interface graphique se produit sur EDT, toute opération de mise en veille sur ce thread suspend la gestion des événements, ce qui fait que l'interface utilisateur apparaît gelée jusqu'à la mise en veille. () conclut.

Solution :

Évitez d'utiliser Thread.sleep() sur EDT ou des threads où sleep() entraînerait un blocage involontaire de l'exécution. Vous pouvez également envisager les options suivantes :

  • Swing Timer : Permet de retarder les actions sur l'EDT.
  • Swing Worker : Fournit un mécanisme pratique pour exécuter des tâches de manière asynchrone sur un thread séparé.
  • TimerTask : Utilisé avec un java.util.Timer pour planifier l'exécution de tâches à des intervalles spécifiques.
  • Thread : Vous pouvez éventuellement créer un fil de discussion séparé et y invoquer Thread.sleep(), bien que cela ne soit généralement pas recommandé.

Remarque :

Pour Java 1.6 ou version ultérieure, Swing Timer et Swing Worker sont les options préférées pour retarder les actions sur EDT. Pour les versions Java antérieures, TimerTask ou Thread peuvent être utilisés conjointement avec le bloc SwingUtilities/EventQueue#invokeXX pour garantir la réactivité de l'interface utilisateur.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal