개발자 미니민의 개발스터디

[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

활동하기