在期货中使用时,我似乎无法触发Java断言。
如下面的示例所示,我创建了一个单个任务的列表,然后使用.invokeAll执行。它输出字符串,但是即使使用-ea
运行,该断言也不会触发。
但是,如果我将ex.invokeAll(test)
交换为ex.invokeAll(test).get(0).get()
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
public class test {
public static void main(String[] args) throws InterruptedException, ExecutionException {
var ex = Executors.newWorkStealingPool();
List<Callable<Void>> test = new ArrayList<>();
test.add(() -> {
System.out.println("I run");
assert false;
return null;
});
ex.invokeAll(test);
}
}
我正在使用Java 11.0.1从命令行运行它
答案 0 :(得分:1)
我以前的回答不正确。
看到的行为(如果我将ex.invokeAll(test)与ex.invokeAll(test).get(0).get()交换)。将来是异步操作结果的表示,但是实际上您首先需要使用get()访问该结果。根据Future(https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#get())的文档,如果您尝试获取执行结果并且执行抛出异常,则将抛出ExecutionException
来表示将来发生了问题。除非您致电get()
,否则您将一无所获。