본문 바로가기

언어/JAVA

INTERRUPT

자바에서 스레드가 작업을 실행하고 있을 때 강제로 멈추도로고 하는 방법은 없다.

  • Thread.stop() 또는 Thread.suspend() 는 문제가 많은 기능으로 사용 불가

따라서 대신 인터럽트라는 방법을 사용하여 특정 스레드에게 작업을 멈춰달라고 요청하는 방법으로 해야한다.

작업이난 서비스를 실행하는 부분의 코드를 작성할 때 멈춰달라는 요청을 받으면 진행 중이던 작업을 모두 정리한 다음 종료하도록 만들어야 한다.

 

실행 중이던 일을 중단 할 때 정상적인 상태에서 마무리 하려면 작업을 진행하던 스레드가 직접 마무리를 하는 것이 가장 좋은 방법이다.

 

메소드 설명
interrupt() 해당하는 스레드에 인터럽트를 거는 역할을 함
isinterrupted() 해당하는 스레드에 인터럽트가 걸려있는지 확인해주는 역할을 함
static interrupted() 현재 스레드의 인터럽트 상태를 해제하고 해제하기 이전의 값이 무엇이엇는지를 알려주는 역할을 한다.
인터럽트 상태를 해제할 수 있는 유일한 방법이다.

 

현재 스레드의 인터럽트 상태를 초기화하기 때문에 사용할 때에는 상당히 주의가 필요하다.

 

interrupted() 를 호출했을 때 결과 값이 TRUE 로 나온다면 인터럽트  요청을 그냥 넘어갈 게 아니라면 interruptedException 처리를 하거나 interrupt 메소드를 호출하여 인터럽트 상태를 다시 되돌려야한다.

 

Thread.sleep() 이나 Object.wait() 메소드와 같은 블로킹 메소드는 인터럽트 상태를 확인하고 있다가 인터럽트가 걸리면 즉시 리턴한다.

두 메소드는 대기하던 중 인터럽트가 걸리면 인터럽트 상태를 해제하면 interruptedException 이 발생한다.

interruptedException 은 인터럽트가 발생해 대기중이던 상태가 예상보다 빨리 끝났다는 것을 의미할 수 있다.

 

public class TestThread extends Thread {

	@Override
    public void run()
    {
    	try 
        {
        	while(true)
            {
            	System.out.println("실행중");
                Thread.sleep(1);
            }
        } 
        catch (InterruptedException e)
        {
        	System.out.println("Interrupted Exception 발생");	
        }
        
        System.out.println("실행 종료!");
    }
}

 

※ 특정 스레드의 interrupt 메소드를 호출한다고 해도 해당 스레드가 처리하던 작업을 멈추지는 않는다. 다만 해당 스레드에게 인터럽트 요청이 있다고 전달만 할 뿐이다.

'언어 > JAVA' 카테고리의 다른 글

[JAVA] ✔ 객체와 클래스  (0) 2022.09.02
연산자  (0) 2022.07.18
변수(Variable)  (0) 2022.07.07