JAVAFX并发查询数据库

时间:2014-05-13 19:01:32

标签: java multithreading

我在JAVA8上使用JAVAFX构建应用程序。 在我的应用程序中,我有一个数据网格,应填充数据库中的结果集。 但是,查询可能需要一段时间,我不希望GUI在此之前处于空闲状态。

针对这类问题的最佳线程架构是什么?

我考虑过为查询本身使用Task,而不是将结果放在数据网格中。 但是,主UI线程不允许其他线程触摸对象。 如果我只是等待线程结束,它就变成了一个同步过程(我想避免)

任何想法?

1 个答案:

答案 0 :(得分:0)

我会去完成那项任务。在后台运行长时间操作总是一个好主意,因此用户界面不会冻结。此外,您可以考虑分页(例如,通过在表格中向下滚动,或者上一个和下一个按钮)

以下是使用任务

的方法
    final Task<List<User>> searchUserTask = new Task<List<User>>() {
        @Override
        protected List<User> call() throws Exception {
              //search logic, for example call to DB
              return //list of users
        }

    };

    //Here we add a listener to the state, so that we can know when the operation finishes, and decide what to do after
    searchUserTask.stateProperty().addListener((ObservableValue<? extends Worker.State> source, Worker.State oldState, Worker.State newState) -> {

        if (newState.equals(Worker.State.SUCCEEDED)) { //the operation finished successfully
            List<User> result = searchTask.getValue();
            //set value to a UI component (this method runs on the UI thread)
            //usersTable.getItems().setAll(matches);
        } else if (newState.equals(Worker.State.FAILED)) {
            Throwable exception = searchTask.getException();
            log.error("Contact search failed", exception);
        }
    });

    new Thread(searchUserTask).start();

所以在这里你有一种方法可以模拟回调机制。 你可以为状态添加一个监听器,当它发生变化时,事件将自动触发,并由你来正确捕获它,然后处理成功状态等。