Impact de Thread.sleep() de Java sur l'interface utilisateur Swing
En Java, utilisation de Thread.sleep() dans une application basée sur Swing peut avoir pour conséquence involontaire de suspendre l'ensemble de l'interface utilisateur, la rendant insensible.
Description du problème :
Considérez l'extrait de code suivant :
<code class="java">// Code to create a simple Swing-based application if (option == JFileChooser.APPROVE_OPTION) { selectedDirectory = chooser.getSelectedFiles(); try { while (true) { runCheck(selectedDirectory); Thread.sleep(1000 * 5);//1000 is 1 second } } catch (InterruptedException e1) { Thread.currentThread().interrupt(); e1.printStackTrace(); } } </code>
Cette application utilise Thread.sleep() pour faire une pause de 5 secondes avant d'effectuer une vérification. Cependant, pendant cette période de veille, l'interface utilisateur ne répond plus et est grisée.
Raison de l'inactivité de l'interface utilisateur :
Thread.sleep() met en pause le fil qui l'appelle , dans ce cas, le fil de répartition d'événement (EDT). L'EDT est responsable de la gestion de tous les événements GUI et du rendu de l'interface utilisateur. Par conséquent, lorsque l'EDT se met en veille, l'interface utilisateur cesse de répondre aux entrées et met à jour son affichage.
Approche alternative :
Pour éviter de geler l'interface utilisateur, une approche plus la solution appropriée consiste à utiliser un javax.swing.Timer. Un minuteur peut planifier l'exécution de tâches hors de l'EDT à des intervalles spécifiés :
<code class="java">Timer t = new Timer(1000 * 5, new ActionListener() { public void actionPerformed(ActionEvent e) { // do your recurring task } });</code>
Dans ce cas, la tâche d'exécution de la vérification est programmée pour s'exécuter toutes les 5 secondes hors de l'EDT, permettant à l'interface utilisateur de rester réactif pendant que le contrôle est en cours.
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!