首页 > Java > java教程 > 如何在 JavaFX 中安全地执行数据库请求而不阻塞 UI 线程?

如何在 JavaFX 中安全地执行数据库请求而不阻塞 UI 线程?

Barbara Streisand
发布: 2024-12-31 00:13:40
原创
848 人浏览过

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

JavaFX 中的并发:使用线程进行数据库请求

了解 JavaFX 线程规则

在 JavaFX 中,有两个关键规则控制线程:

  • 规则 1: UI 操作(修改或访问场景图元素)必须在 JavaFX 应用程序线程上执行。
  • 规则 2: 长时间运行的操作(例如数据库请求)应在后台执行

您的代码和异常

您的代码显示异常,因为您正在尝试从后台线程(使用 Runnable 创建的新 Thread)修改 courseCodeLbl 标签(UI 操作)。这违反了规则 1。

使用线程的正确实现

要解决此问题,您应该在后台线程中执行数据库请求,然后在 JavaFX 应用程序线程上更新 UI。这可以通过以下步骤来实现:

  1. 创建一个代表数据库操作的 Task 对象。
  2. 使用数据库的适当参数初始化任务打电话。
  3. 执行任务 call() 方法来执行数据库查询并返回结果。
  4. 向任务注册一个 setOnSucceeded 处理程序,以便在任务完成时处理 UI 更新。
  5. 在后台线程上执行任务。

使用javafx.concurrent API

JavaFX 提供 javafx.concurrent API 来管理并发并处理来自后台线程的 UI 更新。 Task 是此 API 中的基础类,它允许您:

  • 在后台线程中执行代码并更新应用程序线程上的 UI 属性。
  • 使用诸如 setOnSucceeded 之类的回调处理任务完成和setOnFailed.

DAO 和任务示例

遵循推荐的设计模式,数据库访问应封装在 数据访问对象 (DAO) 中 类,它不知道 UI。然后,可以使用任务在后台线程上调用 DAO 的方法。

这是按类型检索小部件的 DAO 示例:

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

以及使用Task javafx.concurrent.Executor 执行数据库操作并更新 UI:

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);
    }
}
登录后复制

通过封装数据库访问并利用 JavaFX 的并发 API,您可以在单独的线程上执行数据库请求,同时保持 UI 响应能力。

以上是如何在 JavaFX 中安全地执行数据库请求而不阻塞 UI 线程?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板