Heim > Java > javaLernprogramm > Warum friert der Aufruf von Thread.sleep() in einem einzelnen Thread die gesamte Swing-GUI ein?

Warum friert der Aufruf von Thread.sleep() in einem einzelnen Thread die gesamte Swing-GUI ein?

DDD
Freigeben: 2024-11-05 00:00:03
Original
238 Leute haben es durchsucht

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

Sleep() für einen einzelnen Thread in einer Threading-Umgebung verwenden

Beim Arbeiten mit mehreren Threads ist es wichtig, eine Unterbrechung der Ausführung zu vermeiden aller Threads, wenn nur ein einzelner Thread warten muss. Leider kann der Aufruf von Thread.sleep() für einen Thread unbeabsichtigt auch die Ausführung anderer Threads beeinträchtigen.

In diesem Fall verwendet das Code-Snippet JFrame aus javax.swing.* und java.awt.* Pakete. Der Haupt-Thread verarbeitet Benutzereingaben für das Tic-Tac-Toe-Board, während ein sekundärer Thread für die Reaktion der KI verantwortlich ist. Um eine Verzögerung zu implementieren, bevor die KI an der Reihe ist, versucht der Code, ait.sleep(1000) zu verwenden. Allerdings werden beide Threads unerwartet für 1 Sekunde angehalten.

Der Grund für dieses Verhalten liegt in der Tatsache, dass Swing-GUIs in einem eigenen Thread getrennt vom Haupt-Thread erstellt werden. Wenn Thread.sleep() im Event Dispatch Thread (EDT) aufgerufen wird, wird die Verarbeitung aller Swing-Ereignisse angehalten, einschließlich derjenigen, die für Benutzerinteraktionen und GUI-Updates erforderlich sind. Infolgedessen scheint die gesamte GUI eingefroren zu sein, bis der Aufruf von sleep() abgeschlossen ist.

Lösung

Um eine Unterbrechung der gesamten Ausführung zu vermeiden, ist es wichtig, alternative Methoden zu verwenden zur Umsetzung von Verzögerungen beim EDT. Erwägen Sie die folgenden Optionen:

  • 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>
Nach dem Login kopieren
  • Swing-Worker:
  • Andere Threads verwenden (nicht empfohlen):

Wenn Sie Swing-Komponenten nicht bearbeiten müssen, können Sie einen separaten Thread erstellen und Thread.sleep() verwenden diesen Thread, ohne andere Threads oder die GUI zu beeinträchtigen.

Das obige ist der detaillierte Inhalt vonWarum friert der Aufruf von Thread.sleep() in einem einzelnen Thread die gesamte Swing-GUI 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage