[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("스레드 종료...");
}
}
'Java' 카테고리의 다른 글
[JAVA] 자바 - 동기화 / synchronized 블럭 (0) | 2022.09.01 |
---|---|
[JAVA] 자바 - TimerTask 클래스와 Timer 클래스 (0) | 2022.09.01 |
[JAVA] 자바 - 스레드 (Thread) 개념 (0) | 2022.09.01 |
[JAVA] 자바 - DataOutputStream / BufferedReader 버퍼 크기 주기 (0) | 2022.08.30 |
[JAVA] 자바 - RandomAccessFile / PrintWriter / BufferedWriter (0) | 2022.08.30 |
블로그의 정보
개발자 미니민의 개발로그
mini_min