Java 断言在某些情况下不会触发 futures
Java assertion does not fire in some cases with futures
在 futures 中使用时,我似乎无法触发 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
我之前的回答是错误的。
看到的行为(如果我将 ex.invokeAll(test) 与 ex.invokeAll(test).get(0).get() 交换)是预期的。 Future 是异步操作结果的表示,但您实际上需要首先使用 get() 访问该结果。根据 Future ( https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#get() ) 的文档,如果您尝试获取执行结果并且执行抛出异常,则将抛出 ExecutionException
以表示将来出现问题。在您致电 get()
之前,您将一无所获。
在 futures 中使用时,我似乎无法触发 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
我之前的回答是错误的。
看到的行为(如果我将 ex.invokeAll(test) 与 ex.invokeAll(test).get(0).get() 交换)是预期的。 Future 是异步操作结果的表示,但您实际上需要首先使用 get() 访问该结果。根据 Future ( https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#get() ) 的文档,如果您尝试获取执行结果并且执行抛出异常,则将抛出 ExecutionException
以表示将来出现问题。在您致电 get()
之前,您将一无所获。