В настоящее время я работаю над демоном, который будет выполнять много разных задач. Он многопоточен и построен для обработки практически любых внутренних ошибок без сбоев. Ну, я добираюсь до обработки запроса на завершение работы, и я не уверен, как мне следует это делать.Java daemon - обработка запросов на завершение работы
У меня есть настройка закрытия выключения, и когда она называется, она устанавливает переменную, сообщающую основному циклу демона, чтобы остановить работу. Проблема в том, что этот демон порождает несколько потоков, и они могут занять много времени. Например, один из этих потоков может преобразовывать документ. Большинство из них будут быстрыми (я думаю, до 10 секунд), но будут темы, которые могут длиться до 10 + минут.
Что я сейчас делаю, когда отправлен крюк отключения, сделайте цикл в течение 5 секунд на ThreadGroup.activeCount() с помощью спящего режима (или около того) (все эти потоки находятся в ThreadGroup), и до этого цикла я отправлю уведомление всем потокам, сообщающим им, что вызван запрос на завершение работы. Тогда они должны будут немедленно, независимо от того, что они делают для очистки и выключения.
У кого-нибудь есть предложения? Меня интересует то, что делает демон, например MySQL, когда ему говорят останавливаться, он останавливается мгновенно. Что происходит, если работает 10 запросов, которые очень медленны? Подождите или просто закончит их. Я имею в виду, что серверы очень быстрые, поэтому на самом деле нет никакой операции, которую я не мог бы сделать менее чем за секунду. Вы можете сделать LOT в 1000ms сейчас дней.
Благодаря
Я изначально использовал ThreadPoolExecutor и в конечном итоге менял его на что-то еще. Обработка потоков и т. Д. Работает нормально. У меня уже есть настройка для отключения потоков, моя проблема в том, что мне не понравилась идея немедленно отключиться и сказать, что мои потоки останавливаются. Проблема в том, что нет возможности обойти это, если программа должна завершить работу. Наверное, я искал волшебство. Я сделаю это принятым, потому что мой вопрос был не очень описательным. Благодаря! – William
Как насчет вызова 'awaitTermination()' с таймаутом, когда вы получаете сигнал выключения, а затем убиваете потоки (с 'shutdown()'), если это время? У вас есть необходимость обрабатывать завершение работы в течение определенного периода времени? –
Нет, я просто хочу это быстро, потому что, если сервер закрывается, или что-то происходит, задержки не так уж велики. Я думаю, что я собираюсь отправить вызов всем потокам, рассказывая им, что пришло время завершить работу, и им все как 3 секунды, чтобы закончить, если они этого не сделают, я их убью и выйду. Наверное, я искал волшебство, «пусть пауза паузы, позвольте мне потопить, а затем вернуться в реальный мир» через секунду. :) Спасибо за помощь, ребята! – William