首页 >Java >java教程 >如何在 JavaFX 中正确实现数据库请求的线程以避免 UI 阻塞?

如何在 JavaFX 中正确实现数据库请求的线程以避免 UI 阻塞?

Susan Sarandon
Susan Sarandon原创
2024-12-26 10:20:12522浏览

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 提供了一种便捷的管理方式后台线程并更新 UI。

  • 任务: 封装后台操作。
  • 后台任务线程: 执行任务的调用( ) 后台线程上的方法。
  • FX 应用程序主题: 通过注册到任务的事件处理程序完成后更新 UI。

使用 WidgetDAO 和任务的示例

// 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);
    }
}

使用 MyDAO 和任务的示例

// 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);
    }
}

通过正确实现线程,可以确保长时间运行的数据库请求不会阻塞 UI 线程,产生响应式用户界面。

以上是如何在 JavaFX 中正确实现数据库请求的线程以避免 UI 阻塞?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn