Java/Java
(JAVA) 쓰레드의 실행제어 - interrupt(), interrupted()
주누
2020. 1. 25. 16:07
interrupt(), interrupted() - 쓰레드의 작업을 취소
interrupt()는 쓰레드를 강제로 종료시키지는 못한다. 단지 작업을 멈추라고 요청할 뿐 - false로
isInterrupted()
: 현재 쓰레드의 interrupted() 상태를 알려주고 false로 초기화
public boolean isInterrupted() {
return this.isInterrupted(false);
}
값을 입력한 후 interrupt()를 호출하여서 카운트 다운을 종료하는 프로그램
public class ThreadInterrupt {
public static void main(String[] args) {
ThreadInterrupt_1 th1 = new ThreadInterrupt_1();
th1.start();
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요");
System.out.println("입력하신 값은 "+input+"입니다.");
th1.interrupt();
System.out.println("isInterrupted() : "+ th1.isInterrupted());
}
}
class ThreadInterrupt_1 extends Thread{
@Override
public void run() {
int i = 10;
while (i != 0 && !isInterrupted()){
System.out.println(i--);
for (long x =0 ;x<2500000000L;x++); //시간지연
}
System.out.println("카운트가 종료되었습니다.");
}
}
만약 쓰레드가 sleep(), wait(), join()에 의해 WATING 상태에 있을 때 해당 쓰레드에 대해서
interrupt()를 발생시킨다면 RUNNABLE 상태로 바뀌게 된다.
변경
public class ThreadInterrupt {
public static void main(String[] args) {
ThreadInterrupt_1 th1 = new ThreadInterrupt_1();
th1.start();
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요");
System.out.println("입력하신 값은 "+input+"입니다.");
th1.interrupt();
System.out.println("isInterrupted() : "+ th1.isInterrupted());
}
}
class ThreadInterrupt_1 extends Thread{
@Override
public void run() {
int i = 10;
while (i != 0 && !isInterrupted()){
System.out.println(i--);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
System.out.println("카운트가 종료되었습니다.");
}
}
해당 프로그램을 실행시키면 아래와 같은 결과가 나타난다.
값을 입력했음에도 불구하고 카운트가 진행된다.
이는 쓰레드가 잠시 멈추어있을 때 interrupt()를 발생하면 InterruptedException이 발생하여 쓰레드의 interrupt 상태를 false로 초기화하기 때문이다.
class ThreadInterrupt_1 extends Thread{
@Override
public void run() {
int i = 10;
while (i != 0 && !isInterrupted()){
System.out.println(i--);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
interrupt();
}
}
System.out.println("카운트가 종료되었습니다.");
}
}
예외 발생 시점에 interrupt()를 재 호출하여 다시 true로 변경하면 카운트가 진행되지 않는다.
코드 참조
https://github.com/mike6321/PURE_JAVA/tree/master/Thread
mike6321/PURE_JAVA
Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.
github.com