Как использовать универсальную реализацию 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 (задачи).

Мои вопросы:

  1. Как я могу изменить findGame (searchCriteria) для непосредственного вызова метода ForkJoinGameTools.invokeAll () (Как я могу сделать параметр "Collection " tasks ", который нужно передать как аргумент в метод ForkJoinGameTools.invokeAll ())
  2. В этой строке кода: wrappedTasks.add(новый CallableTask(c)), каков параметр (c)?

0 ответов

Другие вопросы по тегам