Что такое поток демона в Java?

Кто-нибудь может сказать мне, что потоки демона в Java?

31 ответ

Демоническая нить

Потоки, работающие в фоновом режиме, называются потоками демона.

Пример потоков демона:

  1. Уборщик мусора.
  2. Диспетчер сигналов.

Цель демонической нити:

Основная цель потоков демона — обеспечить поддержку потоков, не являющихся демонами.

Дополнительная информация о Daemon Thread:

  1. Как правило, потоки демона запускаются в , однако также можно запускать потоки демона.

    Пример: Обычно сборщик мусора работает с приоритетом, однако однажды возникает потребность в дополнительной памяти. JVM увеличивает приоритет сборщика мусора сMIN_PRIORITYкMAX_PRIORITY.



  1. После того, как поток был запущен, его нельзя изменить с потока демона на поток не демона, что приведет кIllegalThreadStateException.

    Пример:

            public static void main(String[] args) {
        Thread.currentThread().setDaemon(true);
    }
    

    Выход:

            Exception in thread "main" java.lang.IllegalThreadStateException
        at java.base/java.lang.Thread.setDaemon(Thread.java:1403)
    


  1. Если мы разветвляем поток, дочерний поток наследует природу родительского потока. Если родительский поток не является демоном, автоматически дочерний поток также не будет демоном, а если родительский поток является демоном, дочерний поток также будет демоном.

            class Scratch {
        public static void main(String[] args) {
            CustomThread customThread = new CustomThread();
            customThread.start();
        }
    }
    class CustomThread extends Thread{
        @Override
        public void run() {
            System.out.println(currentThread().isDaemon());
        }
    }
    

    Выход:

             false
    


  1. Когда завершается последний поток, не являющийся демоном, все потоки демона завершаются автоматически.

            class Scratch {
        public static void main(String[] args) {
            System.out.println("Main Thread Started.");
    
            CustomThread customThread = new CustomThread();
            customThread.setDaemon(true);
            customThread.start();
    
            System.out.println("Main Thread Finished.");
        }
    }
    class CustomThread extends Thread{
        @Override
        public void run() {
            System.out.println("Custom Thread Started.");
            try {
                sleep(2000);
            } catch (InterruptedException ignore) {}
            System.out.println("Custom Thread Finished.");  //Won't get executed.
        }
    }
    

    Выход:

            Main Thread Started.
    Main Thread Finished.
    Custom Thread Started.
    
Другие вопросы по тегам