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 :
<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>
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!