Как JVM завершает streamи демона? или Как написать streamи демона, которые заканчиваются изящно

Гипотетический сценарий:
У меня есть stream демона, ответственный за некоторые операции ввода-вывода, основной stream заканчивается и возвращается, а JVM решает прервать stream моего демона.

Как это делается? Прерывание? Доработка? Как я могу закодировать stream моего демона, чтобы он изящно реагировал при завершении?

Я просто написал следующий код в качестве теста:

public class DaemonThreadPlay { public static void main(String [] args) { Thread daemonThread = new Thread() { public void run() { while (true) { try { System.out.println("Try block executed"); Thread.sleep(1000l); } catch (Throwable t) { t.printStackTrace(); } } } @Override public void finalize() { System.out.println("Finalize method called"); } }; daemonThread.setDaemon(true); daemonThread.start(); try { Thread.sleep(2500l); } catch (Throwable t) { //NO-OP } } } 

Я поставил точки останова в блоке catch streamа daemon и в методе finalize. Ни одна точка останова не была достигнута, даже если блок try был выполнен. Очевидно, что этот код имеет проблемы синхронизации / синхронизации, но я думаю, что мы можем с уверенностью заключить, что streamи демона не прерываются при выключении, и их методы finalize () не вызываются.

Вы всегда можете добавить привязку выключения к JVM Runtime:

 Thread shutdownHook = ... // construct thread that somehow // knows about all the daemon threads Runtime.getRuntime().addShutdownHook(shutdownHook); 

Очевидно, что ваш «выключение» может выполнять любые задачи, необходимые для «изящного» выключения.

Я думаю, вы неправильно поняли, что такое stream демона.

Посмотрите, что представляет собой stream демона в java

Таким образом, это в основном означает, что stream демона не должен делать ввода-вывода или содержать какие-либо ресурсы. Если вы нарушаете это основное правило, то ваш stream не может считаться streamом демона.

Добавление кэша выключения является стандартным способом обеспечения того, чтобы ваш код вызывался до завершения JVM, но даже это не гарантировано на 100%. Например, ваша JVM может аварийно завершать работу, оставляя ОС убирать ресурсы таким образом, чтобы защитить ОС , но, скорее всего, оставит ваше приложение в непоследовательном / ошибочном состоянии.

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

AFAIK, streamи Daemon не предназначены для работы основного streamа ввода-вывода. Если все streamи завершены, JVM может внезапно закрыть все streamи демона. Возможная работа для вашего требования будет заключаться в создании ExecutorService, как показано ниже:

 ExecutorService execPool = Executors.newSingleThreadExecutor(new ThreadFactory() { @Override public Thread newThread(Runnable runnable) { Thread thread = Executors.defaultThreadFactory().newThread(runnable); thread.setDaemon(true); return thread; } }); 

Вызовите метод shutdown для метода executorservice из выключения.

 Runtime.getRuntime().addShutdownHook(....) 

использовать прерывание и присоединиться:

 class Daemon extends Thread { public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println(e); break; } } System.out.println("exit run()"); } } public class So8663107 { public static void main(String[] arguments) throws InterruptedException { System.out.println(Thread.activeCount()); Daemon daemon = new Daemon(); daemon.setDaemon(true); daemon.start(); Thread.sleep(2500); System.out.println(Thread.activeCount()); daemon.interrupt(); daemon.join(); System.out.println(Thread.activeCount()); } } 
  • objective ThreadLocal?
  • В чем разница между Thread start () и Runnable run ()
  • Android, как запуститьOnUiThread в другом classе?
  • Асинхронный и multithreading. Есть ли разница?
  • Неверная операция поперечного streamа
  • В чем разница между параллелизмом, параллелизмом и асинхронными методами?
  • Использование HttpContext.Current в WebApi опасно из-за async
  • Двойная проверка блокировки в синглтоне
  • В чем разница между процессом и streamом?
  • System.Timers.Timer / Threading.Timer vs Thread with WhileLoop + Thread.Sleep для периодических задач
  • Простое описание streamов работника и ввода-вывода в .NET.
  • Interesting Posts

    Как работают все эти услуги «Сохранить видео с YouTube»?

    .NET. Определите тип этого «classа» в статическом методе

    Расширенная (80-разрядная) двойная с плавающей запятой в x87, а не SSE2 – мы ее не пропустили?

    Должен ли я избегать использования! Важно в CSS?

    Как создать пользовательский идентификатор, используя hibernate, в то время как он должен быть первичным ключом таблицы

    Запрос Firebase, если дочерний элемент дочернего элемента содержит значение

    Неужели плохая практика зависит от сборщика мусора .NET?

    Firefox запускает процесс DllHost.exe при загрузке ZIP-файлов

    Являются ли пакеты в дистрибутиве Linux взаимозаменяемыми?

    Должен ли я отключать Wi-Fi на моем ноутбуке, когда подключен кабель Ethernet?

    Log4j, настройка веб-приложения для использования относительного пути

    Стоит ли чистить реестр?

    Что такое вертикальная вкладка?

    JTable Right Align Header

    Последствия поддержки нескольких пользователей Android (новые в версии 4.2) для модели данных на стороне сервера (например, android_id)

    Давайте будем гением компьютера.