首頁 >Java >java教程 >如何在 JavaFX 中正確實作資料庫請求的執行緒以避免 UI 阻塞?

如何在 JavaFX 中正確實作資料庫請求的執行緒以避免 UI 阻塞?

Susan Sarandon
Susan Sarandon原創
2024-12-26 10:20:12519瀏覽

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

為資料庫請求實作執行緒

由於從單獨的執行緒存取 JavaFX UI,您遇到了例外。以下是正確實作執行緒的方法:

JavaFX 中執行緒的一般原則

  • 規則1: 對場景圖的任何修改或存取都必須在FX應用程式線程。
  • 規則 2:長時間運行的操作應在非 FX 應用程式執行緒上執行。

使用執行緒實作

建立一個執行緒並在其上啟動資料庫請求:

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

t.start();

使用JavaFX Concurrent API

使用JavaFX Concurrent API
    任務:
  • 封裝後台操作。
  • 後台任務執行緒:
  • 執行任務的呼叫( ) 後台執行緒上的方法。
  • FX 應用程式主題:
透過註冊到任務的事件處理程序完成後更新 UI。

// 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);
    }
}
使用WidgetDAO 和任務的範例

// 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);
    }
}
使用MyDAO 和任務的範例

透過正確實作線程,可以確保長時間運行的資料庫請求不會阻塞UI 線程,產生響應式使用者介面。

以上是如何在 JavaFX 中正確實作資料庫請求的執行緒以避免 UI 阻塞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn