Maison > Java > javaDidacticiel > Pourquoi l'appel de Thread.sleep() sur un seul thread gèle-t-il l'intégralité de l'interface graphique Swing ?

Pourquoi l'appel de Thread.sleep() sur un seul thread gèle-t-il l'intégralité de l'interface graphique Swing ?

DDD
Libérer: 2024-11-05 00:00:03
original
240 Les gens l'ont consulté

Why Does Calling Thread.sleep() on a Single Thread Freeze the Entire Swing GUI?

Utilisation de sleep() pour un seul thread dans un environnement de thread

Lorsque vous travaillez avec plusieurs threads, il est crucial d'éviter de suspendre l'exécution de tous les threads lorsqu'un seul thread doit attendre. Malheureusement, appeler Thread.sleep() sur un thread peut également affecter par inadvertance l'exécution d'autres threads.

Dans ce cas, l'extrait de code utilise JFrame de javax.swing.* et java.awt.* forfaits. Le thread principal gère les entrées de l'utilisateur pour le tableau tic tac toe, tandis qu'un thread secondaire est responsable de la réponse de l'IA. Pour implémenter un délai avant le tour de l'IA, le code essaie d'utiliser ait.sleep(1000). Cependant, les deux threads sont inopinément mis en pause pendant 1 seconde.

La raison de ce comportement réside dans le fait que les interfaces graphiques Swing sont créées sur leur propre thread distinct du thread principal. Lorsque Thread.sleep() est appelé sur le thread de répartition d'événements (EDT), le traitement de tous les événements Swing est suspendu, y compris ceux requis pour l'interaction de l'utilisateur et les mises à jour de l'interface graphique. En conséquence, l'intégralité de l'interface graphique apparaît gelée jusqu'à la fin de l'appel sleep().

Solution

Pour éviter de suspendre toute l'exécution, il est essentiel d'utiliser des méthodes alternatives pour la mise en œuvre des retards sur l’EDT. Considérez les options suivantes :

  • Swing Timer :
<code class="java">int delay = 1000;

Timer timer = new Timer(delay, new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent ae) {
        // Action to be performed after the delay
    }
});

timer.start();</code>
Copier après la connexion
  • Swing Worker :
  • Utilisez d'autres fils de discussion (pas Recommandé ):

Si vous n'avez pas besoin de manipuler les composants Swing, vous pouvez créer un thread séparé et utiliser Thread.sleep() sur ce thread sans affecter les autres threads ou l'interface graphique.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal