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();
}
}
私はこのようなコードを持っています私のコードタスクは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);
ところで:両方のハンドラーはJavaFXアプリケーションスレッドで実行されるため、UIを安全に変更して、結果/エラーをユーザーに表示できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加