Heim >Java >javaLernprogramm >Wie implementiert man Threading für Datenbankanforderungen in JavaFX ordnungsgemäß, um eine Blockierung der Benutzeroberfläche zu vermeiden?

Wie implementiert man Threading für Datenbankanforderungen in JavaFX ordnungsgemäß, um eine Blockierung der Benutzeroberfläche zu vermeiden?

Susan Sarandon
Susan SarandonOriginal
2024-12-26 10:20:12519Durchsuche

How to Properly Implement Threading for Database Requests in JavaFX to Avoid UI Blocking?

Threading für Datenbankanforderungen implementieren

Sie stoßen auf eine Ausnahme, weil Sie über einen separaten Thread auf die JavaFX-Benutzeroberfläche zugreifen. So können Sie Threading korrekt implementieren:

Allgemeine Prinzipien des Threadings in JavaFX

  • Regel 1:Jede Änderung oder jeder Zugriff auf das Szenendiagramm muss am durchgeführt werden der FX-Anwendungsthread.
  • Regel 2:Lang laufende Vorgänge sollten ausgeführt werden Nicht-FX-Anwendungsthreads.

Implementierung mithilfe von Threads

Erstellen Sie einen Thread und starten Sie die Datenbankanforderung darauf:

Thread t = new Thread(new Runnable() {
    public void run() {
        requestCourseName();
    }
}, "Thread A");

t.start();

Verwenden der JavaFX Concurrent API

Die javafx.concurrent-API bietet eine praktische Möglichkeit, Hintergrundthreads zu verwalten und zu aktualisieren Benutzeroberfläche.

  • Aufgabe: Kapseln Sie den Hintergrundvorgang.
  • Hintergrundaufgaben-Thread: Führt die call()-Methode der Aufgabe im Hintergrund aus Thread.
  • FX-Anwendungsthread: Aktualisiert die Benutzeroberfläche nach Abschluss über ein Ereignis Handler, die für Task registriert sind.

Beispiel für die Verwendung von WidgetDAO und Task

// DAO encapsulates database access
public class WidgetDAO {
    public List<Widget> getWidgetsByType(String type) { ... }
}

// Controller handles UI operations
public class MyController {
    private WidgetDAO widgetAccessor;
    private Executor exec;

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

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

Beispiel für die Verwendung von MyDAO und Task

// DAO encapsulates database access
public class MyDAO {
    public Course getCourseByCode(int code) { ... }
}

// Controller handles UI operations
public class MyController {
    private MyDAO myDAO;
    private Executor exec;

    public void searchCourse() {
        int courseCode = Integer.valueOf(courseId.getText());
        Task<Course> courseTask = new Task<>() {
            @Override
            protected Course call() throws Exception {
                return myDAO.getCourseByCode(courseCode);
            }
        };

        courseTask.setOnSucceeded(e -> {
            Course course = courseTask.getValue();
            courseCodeLbl.setText(course.getName());
        });
        exec.execute(courseTask);
    }
}

Durch die korrekte Implementierung des Threadings stellen Sie sicher, dass Langfristige Datenbankanforderungen blockieren den UI-Thread nicht, was zu einer reaktionsfähigen Benutzeroberfläche führt.

Das obige ist der detaillierte Inhalt vonWie implementiert man Threading für Datenbankanforderungen in JavaFX ordnungsgemäß, um eine Blockierung der Benutzeroberfläche zu vermeiden?. 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