[JAVA] 자바 - 데몬 스레드 (Daemon Thread) / 스레드 종료
by mini_min[JAVA]
자바 - 데몬 스레드 (Daemon Thread) /스레드 종료
✔️ 데몬 스레드 개념
: 다른 일반 스레드를 돕는 보조적인 역할을 하는 스레드이다.
: 일반 스레드가 모두 종료되면 데몬 스레드도 자동 종료된다.
: 데몬 스레드는 일반 스레드로부터 요청을 받아 특정 서비스를 수행하는 작업을 한다.
✨ setDaemon : 스레드를 데몬 스레드 혹은 사용자 스레드로 설정한다. 꼭 시작 전에 호출해야한다.
public static void main(String[] args) { DemoThread t1 = new DemoThread(); DemoThread t2 = new DemoThread(); DemoThread t3 = new DemoThread(); //스레드를 데몬 스레드로 만들기 t1.setDaemon(true); t2.setDaemon(true); t3.setDaemon(true); t1.start(); t2.start(); t3.start(); try { t1.join(); //스레드가 종료될 때까지 대기 위에 3개가 도는 동안까지 대기시키기 아래 프린프ln 으로 못 넘어감! } catch (Exception e) { e.printStackTrace(); } System.out.println("main end..."); // } } class DemoThread extends Thread { @Override public void run() { for(int i=1; i<=20; i++) { System.out.println(getName() + " - > " + i); try { sleep(500); } catch (Exception e) { } } }
💡 t1.join(); //스레드가 종료될 때까지 대기 위에 3개가 도는 동안까지 대기시키기 아래로 못내려간다.
✔️ 스레드 우선순위
: 자바의 스레드 스케쥴링은 우선순위 방식과 라운드 로빈 방식
✨ 우선순위 방식 : 우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케쥴링 하는 것
✨ 라운드 로빈 방식 : 시간 할당량을 정해서 스레드를 정해진 시간만큼 실행하고 다른 스레드를 실행하는 방식이다.
(JVM에 의해 정해지는거라 코드로 제어할 수 없다.)
💡 스레드의 우선 순위는 스레드를 생성한 스레드로부터 상속받는다.
✔️ 스레드 종료 - stop
: Thread 클래스의 stop() 메소드를 호출하면 스레드를 종료할 수 있지만, 권장안함!❌
public static void main(String[] args) { MyThread2 mt = new MyThread2(); Thread t = new Thread(mt); t.start(); try { Thread.sleep(3000); } catch (Exception e) { } //t.stop(); // 스레드 종료. 권장하지 않음 // 스레드 종료가 안뜸. 스레드 리소스가 다 닫히지 않은 것! mt.stopTask(); System.out.println("메인 종료........."); } } // 스레드 종료 class MyThread2 implements Runnable { private boolean bTask = true; @Override public void run() { long n = 0; try { while(bTask) { System.out.println("스레드 : "+ n++); Thread.sleep(500); } } catch (Exception e) { e.printStackTrace(); } System.out.println("스레드 종료 .. "); } public void stopTask() { this.bTask = false; } }
💡 //t.stop();
스레드 리소스가 다 닫히지 않아서 불안정하다는 말이다.
✔️ 스레드 종료 - interrupt()
: interrupt() 로 메소드를 종료시킬 수 있다.
: 스레드가 sleep(), wait(), join() 등의 메소드에 의해 대기 상태에서 interrupt() 메소드 호출하면 interruptedException 예외로 스레드가 종료된다.
public static void main(String[] args) { Thread t = new Thread(new MyThread3()); t.start(); try { Thread.sleep(3000); } catch (Exception e) { } // t.stop(); // 스레드 종료가 출력 안됨 / 권장 안한다. t.interrupt(); System.out.println("메인 종료..."); } } // 이것도 스레드 종료 2번째 방법 class MyThread3 implements Runnable { @Override public void run() { long n = 0; try { while(true) { System.out.println("스레드 : " + n++); Thread.sleep(500); } } catch (InterruptedException e) { System.out.println("인터럽트 발생..."); } System.out.println("스레드 종료..."); } }
블로그의 정보
개발자 미니민의 개발로그
mini_min