У меня есть две функции, каждая из которых вычисляет одну и ту же вещь по-своему. Мне все равно, какой предмет я использую, но мне просто нужно взять тот, который заканчивается первым. Чтобы выполнить 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;
}