java threading — поток демона?

#java #multithreading

#java #многопоточность

Вопрос:

Что произойдет с потоком, рассматриваемым как Daemon?

Как это повлияет на поток?

Что такое «можно и не может» в потоке?

Ответ №1:

Поток демона — это поток, который не препятствует завершению работы JVM после завершения программы, но поток все еще выполняется. Потоки демонов являются поставщиками услуг для других потоков, запущенных в том же процессе, что и поток демона

Например, сборка мусора.

Вы можете явно указать поток, созданный пользовательским потоком, как поток демона, вызвав setDaemon(true) объект Thread.


Для вашей справки,

Обратите внимание, что setDaemon() метод должен быть вызван до того, как будет вызван start() метод потока.Как только поток начал выполняться (т. Е. был вызван его start() метод), его статус демона не может быть изменен. Чтобы определить, является ли поток потоком демона, используйте метод доступа isDaemon() .

Ответ №2:

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

Ответ №3:

Что произойдет с потоком, рассматриваемым как Daemon?

Для флага isDaemon() будет установлено значение true.

Чего не произойдет, так это того, что этот поток не остановит завершение работы приложения.

Как это повлияет на поток?

Ничего, если вы не посмотрите на метод isDaemon().

Что такое «можно и не может» в потоке?

В потоке демона вы можете делать все, что угодно, что вы можете делать в потоке, не являющемся демоном.
Вы не можете гарантировать, что поток завершится.

Ответ №4:

Разница между потоком Daemon и Не-Daemon в Java :

1) JVM не ожидает завершения какого-либо потока демона до того, как он будет создан.

2) Поток демона обрабатывается иначе, чем поток пользователя, когда JVM завершается, наконец, блоки не вызываются, стеки не разматываются и JVM просто завершает работу.

Ответ №5:

Поток демона — это тот, который не помешает завершению программы.

возьмем пример: приложение Java запускается только с одним потоком, «основным» потоком, который запускает main метод. Это обычный (не демонический) поток. Теперь представьте еще раз, что программа запускает другой поток, который помещается в цикл, делая что-то. Если новый поток является обычным (не демоническим) потоком, это предотвратит завершение программы при завершении «main» и будет продолжаться вечно!

 class HelloThread extends Thread  
{  
  public void run()  
  {  
    for ( ; ; )  
    {  
      System.out.println("hello");  
      sleep(1000);  
    }  
  }  
}  
public class RegularThreader  
{  
  public static void main(String[] args)  
  {  
    Thread hello = new HelloThread();  
    hello.start();  
    System.out.println("Sorry, I must be leaving");  
  }  
}  
  

Это не всегда то, что требуется. Иногда вы хотите прекратить эту «фоновую» обработку, когда программа завершается. Для этого вы можете пометить потоки как потоки демона. Потоки демонов не препятствуют завершению программы, но останавливаются, когда останавливается основной поток

  public class DaemonThreader  
    {  
      public static void main(String[] args)  
      {  
        Thread hello = new HelloThread();  
        hello.setDaemon(true);  
        hello.start();  
        System.out.println("Sorry, I must be leaving");  
      }  
}  
  

Попробуйте запустить два разных класса выше и посмотрите, как
результат отличается.
Классическим примером потока демона является поток сборщика мусора, встречающийся во многих виртуальных машинах Java. Он должен выполняться непрерывно, пока выполняются любые другие потоки, но не должен препятствовать завершению программы. Когда программа завершает работу, сборщик мусора больше не нужен.