Как использовать универсальную реализацию ForkJoinPool
Ниже приведена утилита класса Java, которую я должен использовать для запуска двух параллельных задач:
public final class ForkJoinGameTools {
private static final ForkJoinPool defaultPool;
private static final long TIME_OUT = 1;
private static final UncaughtExceptionHandler errorHandler = new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
LOG.error("Fin inattendue de la tache ", t.getName(), e);
}
};
private ForkJoinGameTools() { }
static {
int taches = TASKS_NBR;
defaultPool = new ForkJoinPool(taches, ForkJoinPool.defaultForkJoinWorkerThreadFactory,
errorHandler, false);
}
public static ForkJoinPool getPool() {
return defaultPool;
}
public static <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException {
Collection<Callable<T>> wrappedTasks = new ArrayList<>(tasks.size());
for (Callable<T> c : tasks) {
wrappedTasks.add(new CallableTask<T>(c));
}
return getPool().invokeAll(wrappedTasks, TIME_OUT, TimeUnit.MINUTES);
}
}
А вот функция, которая должна использовать служебный класс, который я уже упоминал:
private GameDTO findGame(final SearchCriteria searchCriteria) {
GameDTO gameDTO = new GameDTO();
List<Callable<GameDTO>> tasks =
new LinkedList<Callable<GameDTO>>();
tasks.add(new Callable<GameDTO>() {
@Override
public GameDTO call() throws Exception {
return findGameWin(searchCriteria);
}
});
tasks.add(new Callable<GameDTO>() {
@Override
public GameDTO call() throws Exception {
return findGameLose(searchCriteria);
}
});
for (Future<GameDTO> result : ForkJoinGameTools.getPool().invokeAll(tasks)) {
try {
GameDTO taskResult = result.get();
.......
......
} catch (CancellationException | InterruptedException | ExecutionException exe) {
throw new UserTechnicalException(ErrorMessage.METIER_CLIENT_API_DOWN, exe);
}
}
return GameDTO;
}
Поэтому здесь вместо вызова ForkJoinGameTools.invokeAll () я делаю это, вызывая ForkJoinGameTools.getPool (). InvokeAll (задачи).
Мои вопросы:
- Как я могу изменить findGame (searchCriteria) для непосредственного вызова метода ForkJoinGameTools.invokeAll () (Как я могу сделать параметр "Collection " tasks ", который нужно передать как аргумент в метод ForkJoinGameTools.invokeAll ())
- В этой строке кода: wrappedTasks.add(новый CallableTask(c)), каков параметр (c)?