반응형
package multi_thread.thread_stop_interrupt;
public class PrintThread1 extends Thread{
private boolean stop;
public void setStop(boolean stop) {
this.stop = stop;
}
public void run() {
while(!stop) {
System.out.println("실행 중");
}
System.out.println("자원 정리");
System.out.println("실행 종료");
}
}
package multi_thread.thread_stop_interrupt;
public class StopFlagExample {
public static void main(String[] args) {
PrintThread1 printThread = new PrintThread1();
printThread.start();
try { Thread.sleep(1000);} catch (InterruptedException e ) {}
printThread.setStop(true);
}
}
스레드를 종료시키는 법에는 2가지 방법이 있다. 하나는 stop()과 interrupt() 메소드를 이용하는 방법
하지만 stop()메소드는 스레드가 갑자기 종료되면 스레드가 사용 중이던 자원이 불안정 상태로 남겨지기 때문에
안 쓰이게 됩니다. 그래서 stop플래그를 이용한 방법이 있습니다.
stop플래그란 무한 반복문을 돌고 있을 때 boolean을 이용해 안정적으로 run()을 종료로 이끌게 하는 역할입니다.
package runnable_jar;
public class PrintThread extends Thread {
@Override
public void run() {
// 방법 1
// try {
// while (true) {
// System.out.println("실행 중");
// Thread.sleep(1); // sleep 있어야 main Thread에서 interrupt() 사용시 인식 함
// }
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// 방법 2
while(true) {
System.out.println("실행중");
if(Thread.interrupted()) { // sleep 없어도 사용 가능한 부분
break;
}
}
System.out.println("자원 정리");
System.out.println("실행 종료");
}
}
package runnable_jar;
public class InterruptExample {
public static void main(String[] args) {
Thread thread = new PrintThread();
thread.start();
try {
Thread.sleep(1000);
}catch(Exception e) {
e.printStackTrace();
}
// 일시 정지 상태일 때 InterruptedException을 발생 시킴
// 실행 대기 또는 실행 상태에서는 발생하지 않는다.
thread.interrupt();
}
}
interrupt 메소드는 스레드가 일시 정지일 때 InterruptedException 예외를 발생 시키는 역할을 합니다.
이것을 이용하면 run()메소드를 정상 종료시킬 수 있습니다.
지금 Thread.sleep(1)이라도 준 이유가 일시정지 일 때 예외를 발생시키기 때문입니다.
반응형
'[Java] > [Java]' 카테고리의 다른 글
[Java] 자바 클린 코드 (Clean Code) (0) | 2022.02.02 |
---|---|
[Java] 자바 멀티스레드 [Multi-Thread] 데몬 스레드 (0) | 2021.08.06 |
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 번갈아 실행시키기[공유객체] (wait(), notify()) (0) | 2021.08.05 |
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 일시 중지 또는 중지 (join() (0) | 2021.08.05 |
[Java] 자바 멀티스레드 [Multi-Thread] 실행 대기 상태 만들기 (yield()) [실행 양보] (0) | 2021.08.04 |