Java 在TaskOnSucceed中调用Taskget安全吗?
以下两个断言错误是否放置正确Java 在TaskOnSucceed中调用Taskget安全吗?,java,concurrency,javafx,Java,Concurrency,Javafx,以下两个断言错误是否放置正确 final Task<String> myTask = new Task<String>() { @Override protected String call() throws Exception { return "Lorem Ipsum"; } @Override protected void succeeded() { super.succeeded();
final Task<String> myTask = new Task<String>() {
@Override
protected String call() throws Exception {
return "Lorem Ipsum";
}
@Override
protected void succeeded() {
super.succeeded();
try {
final String computedString = get();
} catch (final InterruptedException | ExecutionException ex) {
throw new AssertionError(
"Expected get() can called safely in succeeded");
}
}
};
myTask.setOnSucceeded(e -> {
try {
final String computedString = myTask.get();
} catch (final Exception ex) {
throw new AssertionError(
"Expected get() can called safely in onSucceeded");
}
});
在成功中,您可以确保get不会阻塞。也不可能获取ExecutionException,因为这样会触发失败
但是您可以得到InterruptedException,因为其他线程可以随时发送此信号
有关如何处理此特定异常的详细信息,请参见此问题:在setOnSucceeded中调用任务将是安全的,因为在调用成功的回调时,任务已经完成,因此它不会阻塞,也不会显示任何异常
我认为调用是首选,因为它的语义似乎更简单。getValue是非阻塞的,不可能抛出InterruptedException或ExecutionException,并确保只在JavaFX应用程序线程上调用它,因此它既易于理解,又具有额外的安全检查