Я пишу консольное приложение, которое потенциально будет работать в течение нескольких дней и дней. Чтобы дать компьютеру некоторое время простоя, так сказать, мне нужно, чтобы приложение было прерываемым, но таким образом, что оно остановится только в определенных четко определенных точках во время его выполнения.Приложение прерывистой Java-консоли
Я решил использовать обработчик сигналов для ловушки CTRL + C, но он ведет себя так, что я не могу опустить голову.
То, что я хочу что-то вроде этого:
public static void main(String[] args)
{
class MySignalHandler implements SignalHandler
{
boolean interrupted = false;
public void handle(Signal signal)
{
interrupted = true;
}
}
MySignalHandler env = new MySignalHandler();
Signal.handle(new Signal("INT"), env);
while (! env.interrupted)
{
... Carry out a small and well-defined portion of the overall process ...
}
}
Это не работает (по крайней мере, не из моей командной строки Windows). Приложение никогда не заканчивается.
Однако если изменить While-цикл, чтобы выглядеть следующим образом:
while (true)
if (env.interrupted)
System.out.print("Y");
else
System.out.print("N");
... и запустить приложение из командной строки, я получаю следующий эффект: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN (Теперь нажмите CTRL + C) YYYYYYYYYYYYYYYYYYYYY
Очевидно, что сигнал попадает в ловушку кода, поэтому я не понимаю, почему исходный цикл while не будет завершен. Я бы очень признателен за помощь. Возможно, я забыл что-то очевидное.
Заранее благодарен.
Ahhh .... блестящий. Делает совершенный смысл. Спасибо так много –
Итак, условие на if-statement всегда переоценивается, тогда как условие на while-statement не является. –
@ MadsBoyd-Madsen Это не обязательно так. В C такого рода вещь, как известно, зависит от уровня оптимизации, и AFAIK JLS не запретит ее оптимизировать. Вы просто используете неопределенное поведение, используя обычную переменную для связи между потоками. – chrylis