Heim >Java >javaLernprogramm >Warum friert Thread.sleep() meine Swing-Benutzeroberfläche ein?
Auswirkungen von Javas Thread.sleep() auf die Swing-Benutzeroberfläche
In Java die Verwendung von Thread.sleep() in einer Swing-basierten Anwendung kann die unbeabsichtigte Folge haben, dass die gesamte Benutzeroberfläche angehalten wird und nicht mehr reagiert.
Problembeschreibung:
Beachten Sie den folgenden Codeausschnitt:
<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>
Diese Anwendung verwendet Thread.sleep(), um 5 Sekunden lang zu pausieren, bevor eine Prüfung durchgeführt wird. Während dieser Ruhephase reagiert die Benutzeroberfläche jedoch nicht mehr und ist ausgegraut.
Grund für die Inaktivität der Benutzeroberfläche:
Thread.sleep() hält den Thread an, der es aufruft , in diesem Fall der Event Dispatch Thread (EDT). Der EDT ist für die Verarbeitung aller GUI-Ereignisse und die Darstellung der Benutzeroberfläche verantwortlich. Wenn das EDT in den Ruhezustand wechselt, reagiert die Benutzeroberfläche daher nicht mehr auf Eingaben und aktualisiert ihre Anzeige.
Alternativer Ansatz:
Um ein Einfrieren der Benutzeroberfläche zu vermeiden, eine weitere Eine geeignete Lösung ist die Verwendung eines javax.swing.Timer. Ein Timer kann Aufgaben planen, die außerhalb des EDT in bestimmten Intervallen ausgeführt werden sollen:
<code class="java">Timer t = new Timer(1000 * 5, new ActionListener() { public void actionPerformed(ActionEvent e) { // do your recurring task } });</code>
In diesem Fall ist die Ausführung der Aufgabe zur Durchführung der Prüfung so geplant, dass sie alle 5 Sekunden außerhalb des EDT ausgeführt wird, sodass die Benutzeroberfläche bestehen bleibt reagiert, während die Prüfung läuft.
Das obige ist der detaillierte Inhalt vonWarum friert Thread.sleep() meine Swing-Benutzeroberfläche ein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!