2013-03-20 2 views
0

У MI есть программа, которая начинается с цикла, и она вращается в 10 раз, а один цикл длится одну секунду. Мне нужно обработать сигнал (CTRL + C), и при обращении с ним он должен сделать свой собственный цикл, а после его остановки я должен вернуться в основной цикл. Мне удалось сделать почти все выше, но циклы не выполняются отдельно. Они делают это параллельно. Надеюсь, что вы можете помочь ... спасибо :)Обработка сигнала Java, а затем возврат к основной программе

Кстати, мой код:

import sun.misc.Signal; 
import sun.misc.SignalHandler; 

public class MySig { 

    public static void shhh(int s){ //s -> seconds :) 
     s = s*1000; 
     try{ 
      Thread.sleep(s); 
     }catch(InterruptedException e){ 
      System.out.println("Uh-oh :("); 
     } 
    } 

    public static void main(String[] args){ 
     Signal.handle(new Signal("INT"), new SignalHandler() { 
     public void handle(Signal sig) { 
     for(int i=0; i<5; i++){ 
     System.out.println("+"); 
     shhh(1); 
    } 
    } 
    }); 
    for(int i=0; i<10; i++) { 
     shhh(1); 
     System.out.println(i+"/10"); 
    } 
    } 
} 
+0

Я действительно не понимаю ваш вопрос и то, что ваш код должен делать? – Smit

+0

Это домашняя работа в колледже ... Моя программа должна обрабатывать сигнал, который приходит, когда я нажимаю CTRL + C, пока цикл работает, запускает другой цикл для этого сигнала, и после того, как все сигналы обработаны, просто вернитесь к основному циклу и продолжайте ... Прошу прощения, если я не был достаточно ясен – dmacan23

ответ

1

Право, согласно документации, SignalHandler выполняется в отдельном потоке:

.. .when ВМ принимает сигнал, специальный обработчик сигнала C создает новую нить (в приоритетном Thread.MAX_PRIORITY) для запуска зарегистрированного обработчик сигнала Java ..

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

private static final ReentrantLock lock = new ReentrantLock(true); 
private static AtomicInteger signalCount = new AtomicInteger(0); 

public static void shhh(int s) { // s -> seconds :) 
    s = s * 1000; 
    try { 
     System.out.println(Thread.currentThread().getName() + " sleeping for " 
       + s + "s..."); 
     Thread.sleep(s); 
    } catch (InterruptedException e) { 
     System.out.println("Uh-oh :("); 
    } 
} 

public static void main(String[] args) throws Exception { 
    Signal.handle(new Signal("INT"), new SignalHandler() { 
     public void handle(Signal sig) { 
      // increment the signal counter 
      signalCount.incrementAndGet(); 
      // Acquire lock and do all work 
      lock.lock(); 
      try { 
       for (int i = 0; i < 5; i++) { 
        System.out.println("+"); 
        shhh(1); 
       } 
      } finally { 
       // decrement signal counter and unlock 
       signalCount.decrementAndGet(); 
       lock.unlock(); 
      } 
     } 

    }); 
    int i = 0; 
    while (i < 10) { 
     try { 
      lock.lock(); 
      // go back to wait mode if signals have arrived 
      if (signalCount.get() > 0) 
       continue; 
      System.out.println(i + "/10"); 
      shhh(1); 
      i++; 
     } finally { 
      // release lock after each unit of work to allow handler to jump in 
      lock.unlock(); 
     } 
    } 
} 

Там может быть лучше запирающей стратегией.

+0

Это замечательно, но если я нажимаю CTRL + C при обработке одного сигнала, он обрабатывает первый сигнал до конца, петли один раз через основной цикл, а затем обрабатывает второй сигнал ... Что бы я хотел, так это то, что он начинает обрабатывать второй сигнал, как только я его отправляю, затем обрабатывает предыдущий и так далее, пока все сигналы не будут обработаны , а затем вернуться в основной цикл ... Я знаю, я забыл упомянуть об этом выше ... извините – dmacan23

+0

Я отредактировал код выше, чтобы достичь этой цели, хотя он определенно не чувствует себя элегантно. В принципе, я только что представил новый счетчик сигналов и проверил основной поток, что счетчик и вернуться в режим ожидания, если счетчик> 0 – Blake

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