이 기사는 주로 Java의 배경 스레드 문제와 관련하여 다음과 같이 연구합니다.
나는 자바에 배경 스레드가 있다는 것을 들어 본 적이 없습니다. 일반적으로 JVM (Java Virtual Machine)에는 일반적으로 두 가지 유형의 스레드, 즉 사용자 스레드와 배경 스레드가 포함됩니다. 소위 데몬 스레드는 프로그램이 실행 중일 때 백그라운드에서 공통 서비스를 제공하는 스레드를 말하며이 스레드는 프로그램의 필수 부분이 아닙니다. 따라서 모든 비 팩 그라운드 스레드가 종료되면, 즉 사용자 스레드가 종료되면 프로그램이 종료됩니다. 동시에 프로세스에서 모든 배경 스레드를 죽일 것입니다. 반대로, 비 팩 그라운드 스레드가 여전히 실행되는 한, 프로그램은 종료되지 않습니다. 비 백인드 스레드보다 main ()을 실행하는 것이 좋습니다.
이 기능을 기반으로, 가상 시스템의 모든 사용자 스레드가 실행에서 종료되면 Daemon 스레드에는 서비스 객체가 없으며 JVM이 종료됩니다.
이것은 JDK 소스 코드에 설명되어 있습니다.
*이 스레드를 {@linkplain #Isdaemon Daemon} 스레드로 표시합니다.
* 또는 사용자 스레드. Java Virtual Machine은 유일한 경우 종료됩니다
* 실행 된 스레드는 모두 데몬 스레드입니다.
1. 배경 스레드를 시작하기위한 조건 :
/*이 스레드를 배경 스레드로 설정하려면 스레드를 시작하기 전에 setDaemon () 메소드를 호출해야합니다. *이 프로그램에서 문자열을 입력 한 후 메인 스레드가 실행 중지됩니다.* 프로그램에서 실행할 수있는 사용자를위한 스레드가 없습니다. 따라서 배경 스레드가 중지 될 것입니다. * JVM이 중지 될 것이며, 관심있는 독자들은 그것을 스스로 시도 할 수 있습니다 */public class daemonrunner는 runnable {@override public void run () {while (true) {for (int i = 0; i <3; i ++) {system.out.println ( "daemon thread"( "daemon thread"{}}}}}}}}}}}}}}}}}} daemon = new Thread (new DaemonRunner ()); daemon.setdaemon (true); daemon.start (); 스캐너 s = new 스캐너 (System.in); String String = s.nextline (); runtime.getRuntime (). addShutdownHook (new Thread () {@Override Public Void Run () {Super.run (); {timeUnit.milliseconds.sleep (50);} catch (InterruptedException e) {e.printstacktrace ();}});}}2. 모든 스레드가 배경에서 시작된 스레드는 배경 스레드에 속합니다. 배경 스레드임을 명시 적으로 지정하지는 않지만 실제로는 배경 스레드입니다.
/* isdaemon () 메소드를 호출하여 스레드가 백그라운드 스레드인지 확인할 수 있습니다. 배경 스레드 인 경우 * 생성 된 스레드는 자동으로 배경 스레드로 설정됩니다. *이 예에서는 데몬 스레드가 배경 모드로 설정된 다음 많은 하위 스레드를 도출합니다. 이 스레드는 배경 모드로 설정되지 않지만 실제로는 배경 스레드입니다. 그런 다음 데몬 스레드는 무한 루프로 들어가서 루프*의 수율 메소드를 호출하여 다른 스레드 또는 프로세스로 제어를 넘겨주십시오*/클래스 데몬은 runnable {private 스레드 [] t = new 스레드 [10];@public void run () {(int i = 0; i <t.length; i ++) {new 스레드 (new Thread daemonspawn ()); t [i] .start (); system.out.println ( "daemonspawn" + i + "start");} for (int i = 0; i <t.length; i ++) {system.out.println ( "t [" + i + "] .isdaemon" + t [i]. rue}; {stride.yield ();}}} 클래스 Daemonspawn은 runnable {@override public void run () {while (true) {thread.yield ();}}} public class daemons {public static void main (string [] args) {Thread D = New Thread daemon ()); d.setdaemon (true); d.start (); system.out.println ( "d.isdaemon () =" + d.isdaemon ()); try {timeUnit.seconds.sleep (1); // 스타트 업 배경의 스레드가 특정 실행 시간을 얻게하십시오. } catch (InterruptedException e) {e.printstacktrace ();}}}최종 실행 결과는 다음과 같습니다.
d.isdaemon () = true
Daemonspawn 0started
Daemonspawn 1started
Daemonspawn 2started
Daemonspawn 3started
Daemonspawn 4started
Daemonspawn 5Started
Daemonspawn 6started
Daemonspawn 7started
Daemonspawn 8started
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. Executors.newCachedThreadPool() 메소드를 지정하여 ThreadFactory 객체를 지정하십시오. 이런 식으로 시작하려는 스레드를 배경 스레드로 설정할 수도 있습니다.
/*이 예에서,이 정적 생성자 : executors.newCachedThreadpool (new daemonthreadfactory ()* 스레드 변형 객체를 전달할 수 있으므로이 방법을 통해 배경 스레드로 시작하려는 스레드를 설정할 수 있습니다.*/class daemonthreadfactory readments {ride newthread (runnable r) {runnable r) Thread (r); t.setdaemon (true); return t;}}/* 주요 방법에서는 주요 방법의 일반적인 방법이 "System.out.println ("모든 Dameons 시작 ")이라고 불립니다. 메인 라인은 실행을 종료합니다. 그러면 모든 배경 스레드는 실행 중지됩니다. (InterpruptedException e) {System.out.println ( "Interprupted");}} public static void main (string [] args) {executorService exec = exector.newCachedThreadPool (int i = 0; i <10; i ++) {new. daemonfromfactory ());} system.out.println ( "모든 dameons 시작"); try {timeUnit.milliseconds.sleep (500);} catch (InterpruptedException e) {e.printstacktrace ();}}}최종 출력 결과는 다음과 같습니다.
모든 Dameons가 시작되었습니다
스레드 [Thread-3,5, Main] Concurrency.daemonfromfactory@56214c1
스레드 [Thread-2,5, Main] Concurrency.daemonfromfactory@5724147d
스레드 [스레드 -0,5, main] 동시성 .daemonfromfactory@144fe080
스레드 [Thread-1,5, Main] 동시성 .daemonfromfactory@104fa29e
스레드 [Thread-8,5, Main] 동시성 .daemonfromfactory@5b069a7f
스레드 [Thread-9,5, Main] 동시성 .daemonfromfactory@1a7288d1
스레드 [Thread-7,5, Main] Concurrency.daemonfromfactory@25144C3E
스레드 [Thread-4,5, Main] Concurrency.daemonfromfactory@288523d
스레드 [Thread-6,5, Main] Concurrency.daemonfromfactory@1edae2a8
스레드 [스레드 -5,5, main] 동시성 .daemonfromfactory@626007aa
스레드 [Thread-3,5, Main] Concurrency.daemonfromfactory@56214c1
스레드 [Thread-2,5, Main] Concurrency.daemonfromfactory@5724147d
스레드 [Thread-6,5, Main] Concurrency.daemonfromfactory@1edae2a8
스레드 [스레드 -5,5, main] 동시성 .daemonfromfactory@626007aa
스레드 [Thread-4,5, Main] Concurrency.daemonfromfactory@288523d
스레드 [Thread-9,5, Main] 동시성 .daemonfromfactory@1a7288d1
스레드 [Thread-7,5, Main] Concurrency.daemonfromfactory@25144C3E
스레드 [Thread-8,5, Main] 동시성 .daemonfromfactory@5b069a7f
스레드 [Thread-1,5, Main] 동시성 .daemonfromfactory@104fa29e
스레드 [스레드 -0,5, main] 동시성 .daemonfromfactory@144fe080
스레드 [Thread-2,5, Main] Concurrency.daemonfromfactory@5724147d
스레드 [Thread-3,5, Main] Concurrency.daemonfromfactory@56214c1
스레드 [Thread-6,5, Main] Concurrency.daemonfromfactory@1edae2a8
스레드 [Thread-1,5, Main] 동시성 .daemonfromfactory@104fa29e
스레드 [스레드 -0,5, main] 동시성 .daemonfromfactory@144fe080
스레드 [Thread-7,5, Main] Concurrency.daemonfromfactory@25144C3E
스레드 [Thread-8,5, Main] 동시성 .daemonfromfactory@5b069a7f
스레드 [스레드 -5,5, main] 동시성 .daemonfromfactory@626007aa
스레드 [Thread-9,5, Main] 동시성 .daemonfromfactory@1a7288d1
스레드 [Thread-4,5, Main] Concurrency.daemonfromfactory@288523d
스레드 [Thread-2,5, Main] Concurrency.daemonfromfactory@5724147d
스레드 [Thread-3,5, Main] Concurrency.daemonfromfactory@56214c1
스레드 [Thread-8,5, Main] 동시성 .daemonfromfactory@5b069a7f
스레드 [Thread-7,5, Main] Concurrency.daemonfromfactory@25144C3E
스레드 [Thread-4,5, Main] Concurrency.daemonfromfactory@288523d
스레드 [Thread-6,5, Main] Concurrency.daemonfromfactory@1edae2a8
스레드 [Thread-1,5, Main] 동시성 .daemonfromfactory@104fa29e
스레드 [스레드 -0,5, main] 동시성 .daemonfromfactory@144fe080
스레드 [Thread-9,5, Main] 동시성 .daemonfromfactory@1a7288d1
스레드 [스레드 -5,5, main] 동시성 .daemonfromfactory@626007aa
스레드 [Thread-3,5, Main] Concurrency.daemonfromfactory@56214c1
스레드 [Thread-2,5, Main] Concurrency.daemonfromfactory@5724147d
스레드 [Thread-8,5, Main] 동시성 .daemonfromfactory@5b069a7f
4. 우선 사용자 스레드가 갑자기 종료되면 배경 스레드가 최종 절을 실행하지 않고 실행 메소드를 종료한다는 것을 알아야합니다.
/*이 프로그램을 호출 할 때, 마지막 절은 실행되지 않는다는 것을 알 수 있지만, setDaemon ()에 대한 호출을 언급하면* 마지막으로 절이 실행될 것임을 알 수 있습니다.*이 동작은 정확합니다. 약속을 바탕 으로이 행동을 원하지 않더라도 마침내 당신 앞에서 준 약속. 그러나 이것은 사실입니다. 마지막 비 팩 그라운드 스레드가 종료되면 배경 스레드가 갑자기 멈 춥니 다. Main ()가 종료되면 JVM은 즉시 백그라운드에서 모든 * 스레드를 닫습니다. 우아한 방식으로 배경 스레드를 닫을 수 없기 때문에 좋은 생각은 거의 없습니다. 비 백인 집행자는 일반적으로 집행자가 제어하는 모든 작업이 동시에 폐쇄 될 수 있기 때문에 일반적으로 더 나은 방법입니다. */class adaemon emplements runnable {@override public void run () {System.out.println ( "시작 adaemon"); try {timeUnit.seconds.sleep (1); } catch (InterruptedException e) {System.out.println ( "InterruptedException을 통해 종료"); } 마침내 {system.out.println ( "이것은 항상 실행해야합니까?"); }}} public class daemonsdontrunfinally {public static void main (String [] args) {Thread T = New Thread (new Adaemon ()); T. 세트 데몬 (true); t.start (); }} 최종 출력 결과는 다음과 같습니다.
Adaemon 시작
그러나 상황이 다음 상황이되면 출력 결과가 다시 다릅니다.
클래스 adaemon은 runnable {@override public void run () {System.out.println ( "시작 adaemon"); try {timeUnit.seconds.sleep (1); } catch (InterruptedException e) {System.out.println ( "InterruptedException을 통해 종료"); } 마침내 {system.out.println ( "이것은 항상 실행해야합니까?"); }}} public class daemonsdontrunfinally {public static void main (String [] args) {Thread T = New Thread (new Adaemon ()); T. 세트 데몬 (true); t.start (); try {timeUnit.seconds.sleep (1); } catch (InterruptedException e) {e.printstacktrace (); }}}기본 스레드가 갑자기 종료되지 않으므로 백그라운드 스레드는 메인 스레드가 잠을자는 동안 실행 시간을 가져 오므로 최종 인쇄 결과는 다음과 같습니다.
Adaemon 시작
이것은 항상 실행해야합니까?
위는 Java의 배경 스레드 인스턴스 분석에 대한이 기사의 모든 내용이며 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!