Утверждение Java не срабатывает в некоторых случаях с фьючерсами - PullRequest
0 голосов
/ 15 декабря 2018

Я не могу заставить 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 голосов
/ 15 декабря 2018

Мой предыдущий ответ был неверным.

Ожидаемое поведение (если я обменяю 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(), вы ничего не получите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...