Как установить максимальное время выполнения для отдельных задач, работающих в потоках? - PullRequest
0 голосов
/ 20 января 2020

У меня есть набор задач на нескольких уровнях, которые мне нужно выполнять параллельно на потоках, взятых из пула потоков.

Я использую защелку обратного отсчета, чтобы рассчитать общее выполнение уровня.

Проблема: есть несколько задач, которые выполняются дольше, чем их индивидуальное время, только из-за других задач того же уровня, которые имеют больше времени выполнения. Я хочу избежать этого.

Ниже приведен код, который я использую.

private final ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat(
            "TaskExecutor-thread-%d").build());

....

for (int i = 0; i < levels.size(); i++) {

   Set<AbstractTask> taskSet = levels.get(i);
   CountDownLatch latch = new CountDownLatch(taskSet.size());

   int maxAwaitTime = TaskExecutorHelper.getMaxAwaitTime(taskSet);  //this returns max of all 
                                                                     // execution time set for 
                                                                      //individual tasks

   for (AbstractTask t : taskSet) {
                    executor.submit(() -> { t.doExecute(input); });
   } 

   latch.await(maxAwaitTime, TimeUnit.MILLISECONDS);

}

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 20 января 2020

Возможное решение состоит в том, чтобы установить задачу, которая прервет выполнение после заданного времени ожидания. Следующий пример может дать вам представление:

 private final ExecutorService executor = ...;
 private final ScheduledExecutorService scheduler = ...;

 Future future = executor.submit(() -> ... );
 ScheduledFuture scheduledFuture = scheduler.schedule(() -> future.cancel(true), 10, TimeUnit.SECONDS);

Вам потребуется некоторый код для отмены обработчика тайм-аута после выполнения задачи. Подробнее см. ScheduledExecutorService # schelude .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...