본문 바로가기

Java/Java

(JAVA) 쓰레드의 실행제어 - interrupt(), interrupted()

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