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
'Java > Java' 카테고리의 다른 글
(JAVA) 쓰레드의 실행제어 - join() (0) | 2020.01.25 |
---|---|
(JAVA) 쓰레드의 실행제어 - suspend(), resume(), stop(), yield() (0) | 2020.01.25 |
(JAVA) 쓰레드의 실행제어 - sleep (0) | 2020.01.25 |
(JAVA) 데몬쓰레드 (0) | 2020.01.23 |
(JAVA) Integer.parseInt 내부 뜯어보기 (0) | 2020.01.22 |