2011-02-04 3 views
1

У меня есть несколько потоков, работающих в течение почти бесконечного времени и количества итераций. Счетчик итераций сбрасывается до 0, когда найдено лучшее решение. Максимальное количество итераций установлено для предотвращения бесконечного цикла.CountdownLatch comb wait (maxTime) и обратный отсчет()

Я использую обратный отсчет, чтобы остановить процесс, когда вся нить достигает максимального количества итераций. Другими словами, когда поток достигает максимального количества итераций, он уведомляет мой основной поток, используя notifyThreadStop(), который, когда весь поток остановлен, запускает обратный отсчет().

Примечание: мои потоки выполняются внутри объекта FixedThreadPool ExecutorService.

Я хотел бы добавить защелку maxTime. Так что я сделал это следующий

List<Runnable> r = .... //(contains all my runnables) 
myExecutorService.invokeAll(r); 

if(maxtime > 0){ 
    mylatch.await(maxTime,TimeUnit.Seconds); 
    (1) 
    do stuff... 
    exit; 
} 
else{ 
    mylatch.await(); 
    myExecutorService.shutdownNow(); 
    do stuff... 
    exit; 
} 

Теперь я знаю, что если отсчет сработал фиксатор, то это означает, что все потоки будут остановлены, так что я могу shutdownNow мой ExecutorService.

Это не тот случай, когда достигнуто максимальное время. Итак, в (1) я хотел бы повторить все мои бегуны, чтобы закончить их цивилизованным способом :-). Для этого я определил функцию requestTermination(), которая, просто поставив, установила iterationCounter в MaxIterationCount в мои runnables.

So (1) станет

for(Runnable runner: r){ 
     if(r.getIsRunning()){r.requestTermination();} 
    } 
    (2) 

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

So (2) станет

mylatch2.await(); 
    myExecutorService.shutdownNow(); 

Конечно, моя функция notifyThreadStop() нужно будет изменить его и нужно будет флаг говорю это, чтобы сделать обратный отсчет() на mylatch2, как против милача.

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

Вопрос теперь будет: Любой лучший способ справиться с этим? Будет ли shutdownNow() в (1) или (2) обязательным? Зная, что мои мои потоки должны закрыть свой собственный файл журнала и закрыть свою внутреннюю тему Callable * ss * перед выходом.

ответ

0

Если вы используете shutdownNow() и awaitTernimation(), это прервет все запущенные задачи и дождитесь их завершения.

При условии, что задачи могут быть перехвачены и закрыть все ресурсы правильно при прерывании, не должно быть проблем. (Если есть проблема, это ошибка в коде задач, которые вы должны исправить)

+0

Хорошо, я просмотрел [http://www.ibm.com/developerworks/java/library/j-jtp05236.html](http://www.ibm.com/developerworks/java/library/j -jtp05236.html), и я думаю, что получил. В основном я изобретал колесо с помощью своего метода * requestTermination() *. Я сохраню это как ручной способ закрытия моей нити. Все еще нуждается в этом в другой части моего кода. – Bastan

0

Я думаю, что я просто ответил на мой вопрос, но так как все это было написано

Вы сделали, Действительно :-) Если есть одна вещь, чтобы добавить, что вы должны быть осторожны с RuntimeExceptions, в противном случае ваш shutdownNow() никогда не будет вызван. Но вы уже это знали, верно?

+0

да, конечно ;-) – Bastan

Смежные вопросы