在某些情况下,Java断言不会触发期货

时间:2018-12-15 20:04:53

标签: java task future assertion

在期货中使用时,我似乎无法触发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从命令行运行它

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