2015-06-03 2 views
1

Итак, у меня есть эта очень важная тема. Я начинаю, когда начинается программа. Поток слушает события, исходящие из более крупной системы, поскольку основная нить выполняет другие вещи. Нить не должна перестать работать, и если это так, ее следует воссоздать и начать.Текущий статус монитора

Я думаю, я знаю несколько способов для достижения этой цели, но я хотел бы знать ваше мнение по поводу некоторых вещей:

  • Am Я просто стремлюсь ни за что? Я имею в виду, если я в идеале попытаюсь поймать весь код, который может пойти не так, будет ли нить когда-либо предавать меня по какой-либо очевидной причине?
  • Что лучше всего делать, что я изложил? Периодически проверяйте состояние потока с помощью другого потока и ScheduledExecutor? Реализовать какую-то модель наблюдаемого наблюдателя?

ответ

1

Вы можете создать ExecutorService, который слушает события через Executors.newSingleThreadExecutor(). В этом случае вам не нужно смотреть на поток, если это здорово, ExecutorService позаботится об этом. SingleThreadExecutor отвечает за то, что одновременно запускается только одна задача (Runnable или Callable).

+0

Как это работает? Как «Исполнительная служба» прислушивается к событиям? –

+0

Я думаю, что он имел в виду этот метод здесь: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html#afterExecute(java.lang.Runnable,%20java .lang.Throwable) Существует метод afterExecute, который можно использовать для выполнения действий при остановке потока. –

+0

Я имел в виду, что Runnable должен работать, как описано в комментарии от @jameslarge. –

1

Если вы проверяете использование стандартных Java-методов для правильного просмотра состояния потока, у вас не должно быть никаких ошибок. В случае, если выбрано исключенное исключение или поток выходит из-за какой-то странной причины, блок try-finally должен быть достаточным для запуска нового потока (также убедитесь, что он не является демоном). Вы можете использовать цикл while с периодической паузой, предпочтительно используя механизм планирования потока, такой как timed wait(...) или timed LockSupport#park(...). Вы также можете спать в потоке.

1

Нить никогда не должны перестать работать, и если это произойдет, ...

ОК, так что писать так, чтобы она никогда не перестанет работать.

public void run() { 
    while (true) { 
     try { 
      Message message = receiveNextMessage(); 
      handleMessage(message); 
     } catch (Exception ex) { 
      LOGGER.error(ex); 
      if (somethingTrulyHorribleHasHappened(ex)) { 
       Runtime.getRuntime().exit(1); 
      } else { 
       maybeResetSomethingThatNeedsToBeReset(); 
      } 
     } 
    } 
} 
+0

Это перестает работать, когда вызывается [Ошибка] (https://docs.oracle.com/javase/7/docs/api/java/lang/Error.html). На удивление легко создать [StackOverflowError] (http://docs.oracle.com/javase/7/docs/api/java/lang/StackOverflowError.html) из плохой рекурсивной функции, то же самое для [OutOfMemoryError] (http://docs.oracle.com/javase/7/docs/api/java/lang/OutOfMemoryError.html) из плохого цикла. – vanOekel

+0

@vanOekel, из документации JDK, «Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать.«Иногда« VirtualMachineError »(например,« OutOfMemoryError ») - плохая новость только для потока, в котором он был поднят, но в других случаях это означает, что вся JVM ****. Вы не можете знать: один раз –

+0

^^ точно. Вы не представляете, что могло быть повреждено сбоем потока. Мониторинг потоков - это плохая идея - просто заставьте их работать правильно, точно так же, как основной поток приложений, плюс 1, (shoggy) –

0

Это несколько бессмысленное и бесполезное упражнение. Жизненный поток приложения должен быть отлажен и сделан, чтобы не останавливаться. Основной поток вашего приложения длится всю жизнь процесса, а любые другие потоки должны быть спроектированы, протестированы и отлажены по одному и тому же стандарту.

Что произойдет, если остановленный поток испортил данные в других потоках, когда он разбился? Если вы как-то перезапустили его, повреждение данных может ухудшить ситуацию.

+0

Matin, вы определенно правы. Но держать себя готовым к худшему иногда неизбежно для беспокойных людей: D В любом случае вопрос должен был означать не перезапуск, а регенерацию. перезапускаться, но воссоздаваться заново. В этом случае (я должен был упомянуть об этом) статус потока не имеет значения и может быть воссоздан в любое время –

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