자바에서 스레드가 작업을 실행하고 있을 때 강제로 멈추도로고 하는 방법은 없다.
- 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 |