我在JAVA8上使用JAVAFX构建应用程序。 在我的应用程序中,我有一个数据网格,应填充数据库中的结果集。 但是,查询可能需要一段时间,我不希望GUI在此之前处于空闲状态。
针对这类问题的最佳线程架构是什么?
我考虑过为查询本身使用Task,而不是将结果放在数据网格中。 但是,主UI线程不允许其他线程触摸对象。 如果我只是等待线程结束,它就变成了一个同步过程(我想避免)
任何想法?
答案 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();
所以在这里你有一种方法可以模拟回调机制。 你可以为状态添加一个监听器,当它发生变化时,事件将自动触发,并由你来正确捕获它,然后处理成功状态等。