Heim > Java > javaLernprogramm > Warum friert Thread.sleep() meine Swing-Benutzeroberfläche ein?

Warum friert Thread.sleep() meine Swing-Benutzeroberfläche ein?

Linda Hamilton
Freigeben: 2024-11-02 14:44:03
Original
411 Leute haben es durchsucht

Why Does Thread.sleep() Freeze My Swing UI?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage