Использующий обработки сигнала “ТЕРМИН”

Часть лучшего использования, которое я имел для дополнительных методов, является способностью к:

  1. Расширяют функциональность на сторонних объектах (или коммерческий или внутренний к моей компании, но управляемый отдельной группой), который во многих случаях будет отмечен как sealed.
  2. Создают функциональность по умолчанию для интерфейсов, не имея необходимость реализовывать абстрактный класс

, Берут, например, IEnumerable<T>. В то время как это богато дополнительными методами, я нашел это раздражающим, что это не реализовало универсальный метод ForEach. Так, я сделал свое собственное:

public void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
    foreach ( var o in enumerable )
    {
        action(o);
    }
}

Вуаля, весь мой IEnumerable<T> объекты независимо от реализации типа, и записал ли я это или кто-то еще действительно теперь имел ForEach метод путем добавления соответствующего оператора "использования" в моем коде.

16
задан Ciro Santilli 新疆改造中心法轮功六四事件 9 April 2015 в 16:28
поделиться

1 ответ

Обновление, май 2012 г. (2 с половиной года спустя)

Трейказ комментарии:

В текущих версиях Java этот код обработки сигналов не работает из-за ошибки " INT «сигнал» зарезервирован виртуальной машиной или ОС ».
Кроме того, ни одно из других допустимых имен сигналов на самом деле не срабатывает, когда что-то запрашивает закрытие приложения (я просто тщательно протестировал все те, о которых мог узнать ...)
Хук выключения в основном работает, но мы обнаруживаем, что в нашем случае он не срабатывает, поэтому следующий шаг, очевидно, - прибегнуть к регистрации обработчика за спиной JVM

Глава « Интеграция обработки сигналов и исключений ] »в« Руководстве по поиску и устранению неисправностей для HotSpot VM »упоминаются сигналы« SIGTERM , SIGINT , SIGHUP »только для ОС Solaris и Linux.
Упоминается только обработка исключений в Windows.


Исходный ответ (сентябрь 2009 г.)

ShutdownHook должен иметь возможность обрабатывать этот случай

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    public void run() {
        // what you want to do
    }
}));

оговорками )
См. Также:

в качестве иллюстрации простой обработки сигналов:

public class Aaarggh {
  public static void main(String[] args) throws Exception {
    Signal.handle(new Signal("INT"), new SignalHandler () {
      public void handle(Signal sig) {
        System.out.println(
          "Aaarggh, a user is trying to interrupt me!!");
        System.out.println(
          "(throw garlic at user, say `shoo, go away')");
      }
    });
    for(int i=0; i<100; i++) {
      Thread.sleep(1000);
      System.out.print('.');
    }
  }
}
37
ответ дан 30 November 2019 в 16:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: