Вы можете использовать вызываемую декорацию, которая обрабатывает время ожидания.
Предположим, что это оригинальный вызываемый код:
class OriginalCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "";
}
}
Вы можете создать декорацию, вызываемую с помощью этого оригинального вызова и исполнителя:
class DecorateCallable implements Callable<String> {
ExecutorService executorService;
OriginalCallable callable;
public DecorateCallable(ExecutorService executorService, OriginalCallable callable) {
this.executorService = executorService;
this.callable = callable;
}
@Override
public String call() throws Exception {
Future<String> future = executorService.submit(callable);
try {
return future.get(2000, TimeUnit.SECONDS);
} catch (TimeoutException | InterruptedException e) {
}
return null;
}
}
Если вы решили использовать это, вам нужно удвоить размер пула:
Executors.newFixedThreadPool(threads * 2);
и добавьте некоторые условия, например if(future.get() != null)
, перед тем, как поместить их в окончательный набор результатов.