JavaFX - 在后台线程完成之前返回的方法

时间:2017-04-24 22:16:01

标签: multithreading javafx

我有一个非常简单的JavaFX应用程序。在其中,我有一个Java对象来处理数据库活动,主要是执行查询。为了防止我的UI在查询执行时完全冻结,我使用javafx.concurrent.Service实现了后台线程。这在我的connect方法上很有用,它不返回任何东西。但是,在我的查询方法中,它会立即跳转到返回行,当然返回null。然后它返回并运行查询,但它已经返回了一个空的arraylist。

我做错了什么?

这是我的方法:

public ArrayList<Foo> runQuery() throws SQLException {
        ArrayList<Foo> result = new ArrayList<Foo>();
        backgroundThread = new Service<Void>() {
            @Override
            protected Task<Void> createTask() {
                return new Task<Void>() {
                    protected Void call() throws Exception {
                        stmt = conn.createStatement();
                        String query = "Select stuff...
                        rs = stmt.executeQuery(query);
                        return null;
                    }
                };
            }
        };
        backgroundThread.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
            @Override
            public void handle(WorkerStateEvent argo) {
                try {
                    while (rs.next()) {
                        result.add(new Foo(rs.getString(1)));
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                controller.addLogEntry("done.\n");
            }
        });
    backgroundThread.restart(); 
    return result;
    }

0 个答案:

没有答案