В этой статье в основном изучаются проблемы с фоновыми темами в Java, следующим образом.
Я никогда не слышал об этом раньше, что в Java есть фоновые нити. Вообще говоря, JVM (виртуальная машина Java) обычно включает в себя два типа потоков, а именно пользовательский поток и фоновый поток. Так называемая ветка демона относится к потоке, которая предоставляет общую услугу в фоновом режиме при запуске программы, и этот поток не является незаменимой частью программы. Следовательно, когда все потоки, не связанные с отступлением, заканчиваются, то есть, когда пользовательские потоки заканчиваются, программа заканчивается. В то же время это убьет все фоновые потоки в процессе. И наоборот, до тех пор, пока любые безразличные потоки все еще работают, программа не закончится. Лучше выполнить main (), чем поток, не связанный с беззабочником.
Основываясь на этой функции, когда все пользовательские потоки на выходе виртуальной машины от запуска, поток Daemon не имеет объектов обслуживания, JVM выходит.
Это объясняется в исходном коде JDK.
* Отмечает этот поток как {@linkplain #isdaemon Daemon}}
* или пользовательский поток. Виртуальная машина Java выходит, когда единственная
* Запуск потоков - это все потоки демонов.
1. Условия для запуска фонового потока:
/*Метод setDaemon () должен быть вызван перед запуском потока, чтобы установить этот поток в качестве фонового потока. * В этой программе, после того, как мы введем строку, основной поток перестанет работать*, тогда для пользователя нет потока, который может работать в программе. Таким образом, фоновый поток будет остановлен * JVM будет остановлен, и заинтересованные читатели могут попробовать его сами */открытый класс Daemonrunner реализует Runnable {@override public void run () {while (true) {for (int i = 0; i <3; i ++) {System.out.println ("Deemon Thread"+I);}}}} public static static static static static static void vide vide vide (wist vide);}}}}}}}}}}}}}}}}}}}}}}}) daemon = new Thread (new Daemonrunner ()); Daemon.setDaemon (true); daemon.start (); Scanner S = новый сканер (System.in); String String = S.Nextline (); Runtime.getRuntime (). AddShutDownhook (new Thread ()@wover vid run () (). Exit "); try {timeUnit.milliseconds.sleep (50);} catch (прерывание Exception e) {e.printstacktrace ();}}});}}2. Все потоки, запускаемые в фоновом потоке, принадлежат фоновому потоку. Хотя вы не указываете, что это фоновые потоки, они действительно являются фоновыми потоками.
/* Вы можете определить, является ли поток фоновым потоком, вызывая метод isdaemon (). Если это фоновый поток, * тогда любой поток, который он создает, автоматически устанавливается на фоновый поток * В этом примере поток демона устанавливается в фоновый режим, а затем выводит много дочерних потоков. Эти потоки не установлены в режиме * фонового режима, но они действительно являются фоновыми потоками. Затем поток демона входит в бесконечный цикл и вызывает метод дохода в цикле*, чтобы передать элемент управления другим потокам или процессам*/Class Date Daemon реализует {Private Thread [] T = новый поток [10];@Переопределить public void run () {for (int i = 0; i <t.length; i ++) {t [i] = new (int i = 0; i <t.length; i ++) Daemonspawn ()); t [i] .start (); System.out.println ("daemonspawn" + i + "запустил");} для (int i = 0; i <t.length; i ++) {System.out.println ("t [" + i + "] .isdaemon" + t [i]. {Thread.yield ();}}} класс daemonspawn реализует runnable {@override public void run () {while (true) {thread.yield ();}}} public class daemons {public static void main (string [] args) {thread d = новый поток (новый Daemon ()); d.setdaemon (true); d.start (); system.out.println ("d.isdaemon () =" + d.isdaemon ()); try {timeunit.seconds.sleep (1); // Пусть потока в фоне запуска получает определенное время выполнения. } catch (прерывание Exception e) {e.printStackTrace ();}}}Окончательные результаты выполнения следующие:
d.isdaemon () = true
Daemonspawn 0Started
Daemonspawn 1started
Daemonspawn 2Started
Daemonspawn 3Started
Daemonspawn 4started
Daemonspawn 5Started
Daemonspawn 6Started
Daemonspawn 7Started
Daemonspawn 8 старт
Daemonspawn 9started
t [0] .isdaemontrue
T [1] .isdaemontrue
T [2] .isdaemontrue
T [3] .isdaemontrue
T [4] .isdaemontrue
T [5] .isdaemontrue
T [6] .isdaemontrue
T [7] .isdaemontrue
T [8] .isdaemontrue
T [9] .isdaemontrue
3. Укажите объект TreadFactory, указав метод Executors.newCachedThreadPool() . Таким образом, мы также можем установить поток, который мы хотим начать как фоновый поток.
/* В этом примере, для этого статического конструктора: rececure.newcachedthreadpool (new Daemonthreadfactory ()* Мы можем передать в Treadfactory объект, поэтому мы можем установить поток, который мы хотим начать как фоновый поток через этот метод* Это должно быть отмечено. Thread (r); T.SetDaemon (TRUE); return T;}}/* В этом примере сначала будет назван обычный метод в основном методе, «System.out.println (« Все дамы начались »);* Так что это утверждение будет напечатано сначала. Основная линия заканчивает запуск. (Прерывание Exception e) {System.out.println ("прерывание");}} public void main (string [] args) {expertionservice exc = executors.newcachedthreadpool (new daemonthreadfactory ()); DaemonFromFactory ());} System.out.println ("Все Dameons начались"); try {timeUnit.milliseconds.sleep (500);} catch (прерывание Exception e) {e.printstacktrace ();}}}}}}}}}}}}Окончательный результат вывода:
Все Дамины начались
Thread [Thread-3,5, Main] complornency.daemonfromfactory@56214c1
Thread [Thread-2,5, Main] complornency.daemonfromfactory@5724147d
Thread [Thread-0,5, Main] oclurlincy.daemonfromfactory@144fe080
Thread [Thread-1,5, Main] complornency.daemonfromfactory@104fa29e
Thread [Thread-8,5, Main] oclurlincy.daemonfromfactory@5b069a7f
Thread [Thread-9,5, Main] oclurnency.daemonfromfactory@1a7288d1
Thread [Thread-7,5, Main] complornency.daemonfromfactory@25144c3e
Thread [Thread-4,5, Main] complornuence.daemonfromfactory@288523d
Thread [Thread-6,5, Main] complornency.daemonfromfactory@1edae2a8
Thread [Thread-5,5, Main] complornency.daemonfromfactory@626007aa
Thread [Thread-3,5, Main] complornency.daemonfromfactory@56214c1
Thread [Thread-2,5, Main] complornency.daemonfromfactory@5724147d
Thread [Thread-6,5, Main] complornency.daemonfromfactory@1edae2a8
Thread [Thread-5,5, Main] complornency.daemonfromfactory@626007aa
Thread [Thread-4,5, Main] complornuence.daemonfromfactory@288523d
Thread [Thread-9,5, Main] oclurnency.daemonfromfactory@1a7288d1
Thread [Thread-7,5, Main] complornency.daemonfromfactory@25144c3e
Thread [Thread-8,5, Main] oclurlincy.daemonfromfactory@5b069a7f
Thread [Thread-1,5, Main] complornency.daemonfromfactory@104fa29e
Thread [Thread-0,5, Main] oclurlincy.daemonfromfactory@144fe080
Thread [Thread-2,5, Main] complornency.daemonfromfactory@5724147d
Thread [Thread-3,5, Main] complornency.daemonfromfactory@56214c1
Thread [Thread-6,5, Main] complornency.daemonfromfactory@1edae2a8
Thread [Thread-1,5, Main] complornency.daemonfromfactory@104fa29e
Thread [Thread-0,5, Main] oclurlincy.daemonfromfactory@144fe080
Thread [Thread-7,5, Main] complornency.daemonfromfactory@25144c3e
Thread [Thread-8,5, Main] oclurlincy.daemonfromfactory@5b069a7f
Thread [Thread-5,5, Main] complornency.daemonfromfactory@626007aa
Thread [Thread-9,5, Main] oclurnency.daemonfromfactory@1a7288d1
Thread [Thread-4,5, Main] complornuence.daemonfromfactory@288523d
Thread [Thread-2,5, Main] complornency.daemonfromfactory@5724147d
Thread [Thread-3,5, Main] complornency.daemonfromfactory@56214c1
Thread [Thread-8,5, Main] oclurlincy.daemonfromfactory@5b069a7f
Thread [Thread-7,5, Main] complornency.daemonfromfactory@25144c3e
Thread [Thread-4,5, Main] complornuence.daemonfromfactory@288523d
Thread [Thread-6,5, Main] complornency.daemonfromfactory@1edae2a8
Thread [Thread-1,5, Main] complornency.daemonfromfactory@104fa29e
Thread [Thread-0,5, Main] oclurlincy.daemonfromfactory@144fe080
Thread [Thread-9,5, Main] oclurnency.daemonfromfactory@1a7288d1
Thread [Thread-5,5, Main] complornency.daemonfromfactory@626007aa
Thread [Thread-3,5, Main] complornency.daemonfromfactory@56214c1
Thread [Thread-2,5, Main] complornency.daemonfromfactory@5724147d
Thread [Thread-8,5, Main] oclurlincy.daemonfromfactory@5b069a7f
4. Прежде всего, вы должны понять, что если пользовательский поток внезапно выходит, фоновый поток завершит свой метод запуска без выполнения предложения, наконец,.
/* Когда вы позвоните в эту программу, вы увидите, что пункт, наконец, не будет выполнен, но если вы прокомментируете вызов SetDaemon (), вы увидите, что предложение «наконец» будет выполнено.* Это поведение верно. Даже если вы не хотите этого поведения, основанного на обещании, которое вы наконец дали перед вами. Но это так. Когда последняя безразличная нить заканчивается, фоновая нить внезапно остановится. Потому что после выхода Main () JVM немедленно закроет все * потоки в фоновом режиме. Поскольку вы не можете элегантно закрывать фоновые темы, они вряд ли хорошая идея. Исполнители, не являющиеся Backend, обычно являются * лучшим способом, потому что все задачи, управляемые исполнителем, могут быть закрыты одновременно. */class Adaemon реализует runnable {@Override public void run () {System.out.println ("Starting Adaemon"); try {timeUnit.seconds.sleep (1); } catch (прерывание Exception e) {System.out.println («Выход через прерывание»); } наконец {System.out.println («Это всегда должно работать?»); }}} public class daemonsdontrunfinally {public static void main (string [] args) {thread t = new Thread (new Adaemon ()); T.SetDaemon (True); t.start (); }} Окончательные результаты вывода следующие:
Начало Адамона
Однако, если ситуация становится следующей ситуацией, результаты выходных данных снова будут отличаться:
класс Adaemon реализует runnable {@override public void run () {System.out.println ("Начало Adaemon"); try {timeUnit.seconds.sleep (1); } catch (прерывание Exception e) {System.out.println («Выход через прерывание»); } наконец {System.out.println («Это всегда должно работать?»); }}} public class daemonsdontrunfinally {public static void main (string [] args) {thread t = new Thread (new Adaemon ()); T.SetDaemon (True); t.start (); try {timeUnit.seconds.sleep (1); } catch (прерванное искусство e) {e.printstacktrace (); }}}Поскольку основной поток не выходит внезапно, фоновый поток получает время выполнения во время списка основного потока, так что окончательный результат печати:
Начало Адамона
Это всегда должно работать?
Выше приведено все содержание этой статьи об анализе экземпляров фоновых потоков в Java, и я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!