2013-08-26 4 views
0

Я пишу консольное приложение, которое потенциально будет работать в течение нескольких дней и дней. Чтобы дать компьютеру некоторое время простоя, так сказать, мне нужно, чтобы приложение было прерываемым, но таким образом, что оно остановится только в определенных четко определенных точках во время его выполнения.Приложение прерывистой 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 не будет завершен. Я бы очень признателен за помощь. Возможно, я забыл что-то очевидное.

Заранее благодарен.

ответ

1

Вы пытаетесь использовать interrupted для связи между потоками, но не сказали компилятору, что он «упрощает» ваш цикл while, только проверяя один раз. Сделать interruptedvolatile.

+0

Ahhh .... блестящий. Делает совершенный смысл. Спасибо так много –

+0

Итак, условие на if-statement всегда переоценивается, тогда как условие на while-statement не является. –

+0

@ MadsBoyd-Madsen Это не обязательно так. В C такого рода вещь, как известно, зависит от уровня оптимизации, и AFAIK JLS не запретит ее оптимизировать. Вы просто используете неопределенное поведение, используя обычную переменную для связи между потоками. – chrylis

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