Rah*_*ngh 3 java multithreading javafx executorservice
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import javafx.concurrent.Task;
public class T {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Task t = new Task(){
@Override
protected Object call() throws Exception {
System.out.println(1/0);
return null;
}
};
//My progresss Bar in JavaFX
//Progressbar.progressProperty().bind(t.progressProperty());
Future future = executorService.submit(t);
try {
future.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //returns null if the task has finished correctly.
executorService.shutdown();
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个类似于这样的代码,我的代码任务在对象调用中有内部方法调用,抛出 sql 异常,但我永远无法在执行器服务中捕获它,也在提交调用上方我有一个 javafx 进度条,但这似乎也使用 future 时会卡住,就像主 ui 挂起一样。没有未来,进度条就会起作用。
Future.get是一个阻塞调用。这就是 UI 挂起的原因。
不要使用 来Future获得结果。而是使用Task的onSucceeded事件处理程序。事件处理程序onFailed可用于获取异常。例子:
t.setOnSucceeded(evt -> System.out.println(t.getValue()));
t.setOnFailed(evt -> {
System.err.println("The task failed with the following exception:");
t.getException().printStackTrace(System.err);
});
executorService.submit(t);
Run Code Online (Sandbox Code Playgroud)
顺便说一句:两个处理程序都在 JavaFX 应用程序线程上运行,因此可以安全地用于修改 UI 以向用户显示结果/错误。