ExecutorService InvokeAny выполняет все вызовы до завершения - PullRequest
0 голосов
/ 21 марта 2020

У меня есть две функции, каждая из которых вычисляет одну и ту же вещь по-своему. Мне все равно, какой предмет я использую, но мне просто нужно взять тот, который заканчивается первым. Чтобы выполнить sh это, я пытаюсь использовать ExecutorService, используя метод invokeAny (), как показано ниже. Тем не менее, когда я запускаю свой код, method1 и method2 запускаются полностью до завершения, даже если для method1 вставлен спящий режим в течение 10 минут, чтобы убедиться, что он не завершен sh перед методом 2. Я знаю, что оба завершены из-за операторы журнала, которые передаются непосредственно перед возвратом внутри обоих методов. Есть ли что-то, что мне не хватает, как это должно работать?

final ImmutableList.Builder<Callable<MyObject>> callableBuilder = ImmutableList.builder();
        callableBuilder.add( () -> this.method1( arg1, arg2 ) );

        callableBuilder.add( () -> this.method2( arg1, arg2 ) );

        try
        {

            final MyObject myObject = this.executorService.invokeAny( callableBuilder.build() );
            return myObject;
        }
        catch ( final InterruptedException e )
        {
            throw new CustomException( "Interrupted exception", e );
        }
        catch ( final ExecutionException e )
        {
            throw new CustomException( "Execution exception", e );
        }

Каждый метод выглядит примерно так:

method1( arg1, arg2) {
try {
// Lots of logic and external service calls
 log("method1"):
}
catch ( CustomException e)
{
throw e;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...