Heim >Java >javaLernprogramm >Wie kann ich Datenbankanfragen in JavaFX sicher ausführen, ohne den UI-Thread zu blockieren?

Wie kann ich Datenbankanfragen in JavaFX sicher ausführen, ohne den UI-Thread zu blockieren?

Barbara Streisand
Barbara StreisandOriginal
2024-12-31 00:13:40832Durchsuche

How to Safely Perform Database Requests in JavaFX Without Blocking the UI Thread?

Parallelität in JavaFX: Threads für Datenbankanforderungen verwenden

JavaFX-Threading-Regeln verstehen

In JavaFX regeln zwei Schlüsselregeln das Threading:

  • Regel 1: UI-Operationen (Ändern oder Zugriff auf Szenendiagrammelemente) müssen im JavaFX-Anwendungsthread ausgeführt werden.
  • Regel 2:Langfristige Vorgänge (z. B. Datenbankanforderungen) sollten in einem Hintergrundthread ausgeführt werden.

Ihr Code und die Ausnahme

Ihr Code zeigt eine Ausnahme an, weil Sie versuchen, die zu ändern courseCodeLbl-Label (ein UI-Vorgang) aus einem Hintergrundthread (dem neuen Thread, der mit Runnable erstellt wurde). Dies verstößt gegen Regel 1.

Korrekte Implementierung mithilfe von Threads

Um dieses Problem zu beheben, sollten Sie die Datenbankanforderung in einem Hintergrundthread ausführen und dann die Benutzeroberfläche im JavaFX-Anwendungsthread aktualisieren. Dies kann mit den folgenden Schritten erreicht werden:

  1. Erstellen Sie ein Task-Objekt, das den Datenbankvorgang darstellt.
  2. Initialisieren Sie die Aufgabe mit den entsprechenden Parametern für die Datenbank Rufen Sie an.
  3. Umsetzen Sie die Aufgaben call()-Methode, um die Datenbankabfrage durchzuführen und das Ergebnis zurückzugeben.
  4. Registrieren Sie einen setOnSucceeded-Handler bei der Aufgabe, um die UI-Aktualisierung zu verarbeiten, wenn die Aufgabe abgeschlossen ist.
  5. Führen Sie die Aufgabe in einem Hintergrundthread aus.

Verwenden Sie die javafx.concurrent API

JavaFX stellt die javafx.concurrent API bereit, um die Parallelität zu verwalten und UI-Updates von Hintergrundthreads zu verarbeiten. Task ist die grundlegende Klasse in dieser API und ermöglicht Ihnen Folgendes:

  • Code in einem Hintergrundthread ausführen und UI-Eigenschaften im Anwendungsthread aktualisieren.
  • Erledigung von Aufgaben mithilfe von Rückrufen wie setOnSucceeded und setOnFailed.

Beispiel mit DAO und Task

Dem empfohlenen Entwurfsmuster folgend sollte der Datenbankzugriff in einem Data Access Object (DAO) gekapselt werden. -Klasse, die die Benutzeroberfläche nicht kennt. Anschließend kann eine Aufgabe verwendet werden, um die Methoden des DAO in einem Hintergrundthread aufzurufen.

Hier ist ein Beispiel für ein DAO, das Widgets nach Typ abruft:

public class WidgetDAO {
    public List<Widget> getWidgetsByType(String type) throws SQLException {
        // Database query to retrieve widgets
    }
}

Und eine Controller-Klasse, die verwendet Aufgabe und javafx.concurrent.Executor zum Ausführen der Datenbankoperation und Aktualisieren Sie die Benutzeroberfläche:

public class MyController {
    private WidgetDAO widgetAccessor;
    private Executor exec; // Executor to execute tasks on a thread pool

    public void searchWidgets() {
        final String searchString = widgetTypeSearchField.getText();
        Task<List<Widget>> widgetSearchTask = new Task<>() {
            @Override
            public List<Widget> call() throws Exception {
                return widgetAccessor.getWidgetsByType(searchString);
            }
        };

        widgetSearchTask.setOnSucceeded(e -> {
            widgetTable.getItems().setAll(widgetSearchTask.getValue());
        });

        exec.execute(widgetSearchTask);
    }
}

Durch die Kapselung des Datenbankzugriffs und die Nutzung der Parallelitäts-API von JavaFX können Sie Datenbankanforderungen in separaten Threads ausführen und gleichzeitig die Reaktionsfähigkeit der Benutzeroberfläche beibehalten.

Das obige ist der detaillierte Inhalt vonWie kann ich Datenbankanfragen in JavaFX sicher ausführen, ohne den UI-Thread zu blockieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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