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() 之前,您将一无所获。