установка таймаута для каждого из выполнений в java. util. concurrent.ExecutorService - PullRequest
2 голосов
/ 06 января 2012

Как я могу создать тайм-аут для каждой команды, которая выполняется параллельно, используя java.​util.​concurrent.ExecutorService?

Мой код выглядит примерно так:
Например, в приведенном ниже коде мне нужно obj1 работать максимум 1 минуту, obj2 2 минуты и другие 5 минут.

ExecutorService exService;
exService = Executors.newCachedThreadPool();
exService.execute(obj1);
exService.execute(obj2);
exService.execute(obj3);
exService.execute(obj4);
exService.shutdown();
boolean finshed = exService.awaitTermination(5, TimeUnit.MINUTES);
if (finshed) {
    //Doing something
}

РЕДАКТИРОВАТЬ:
К сожалению, класс obj1 - obj4 очищает некоторые веб-страницы с помощью WebHarvest, который использует Jakarta HttpClient для чтения веб-страниц и HttpClient (ини сам WebHarvest) не имеет никакой функции для тайм-аута на всю работу по чтению и / или очистке страницы.
Это моя трудоемкая задача, и я подумал об уничтожении потока ExecutorService после тайм-аута для решения этой проблемы.

Ответы [ 3 ]

3 голосов
/ 06 января 2012

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

1 голос
/ 06 января 2012

с моей точки зрения, я думаю, что такие вещи требуют более надежных основ, чем обычные классы Java, поэтому я бы предложил использовать любую инфраструктуру планировщика (Quartz или любой другой проект), которая может дать вам ручку (работа идентификаторы), чтобы убить ваши трудоемкие задачи.

У вас может быть что-то вроде этого:

Main Thread запускает Quartz Scheduler, получает подписки на разные вакансии говоря: Job1, Job 2 и TimeCheckerJob

TimeCheckerJob будет вечной работой, уведомляется о любой новой работе и будет проверять время жизни для каждой новой работы ... В этой работе вам придется иметь дело со временем начала каждой работы, остерегаясь часов ОС и не пытайтесь устанавливать слишком жесткие ограничения (наносекунды - это выдумка).

НТН Мои 2 цента Джером

1 голос
/ 06 января 2012

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

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