인터럽트(Interrupt)
인터럽트(Interrupt)는 프로그램 실행 중 예외상황이 발생했을 때 하던 작업을 중단하고 우선 순위가 높은 다른 작업을 처리한 후 원래 작업으로 복귀하는 것을 말한다.
interrupt() / interrupted()
스레드를 즉시 종료시키기 위한 stop()메소드가 있었지만 deprecated되었다.
이는 스레드를 갑자기 종료하면 사용중인 자원들이 제대로 해제되지 않고 남겨지기 때문이다.
void interrupt() // 쓰레드의 interrupted상태를 false에서 true로 변경 = 인터럽트 예약
boolean isInterrupted()// 쓰레드의 interrupted상태를반환 = 인터럽트가 예약되어 있는지 확인
static boolean interrupted() //현재쓰레드의 interrupted상태를반환후, false로 변경 = 확인 후 예약 취소
interrupt()는 스레드가 일시 정지 상태일 때 InterruptedException 예외를 발생시키는 역할을 한다.
진행 중인 쓰레드의 작업이 끝나기 전에 취소시켜야할 때 사용하곤 한다.
ex) 큰 파일 다운로드 할 때 너무 오래 걸려 다운로드를 포기하고 취소
스레드가 실행 대기 또는 실행 상태에 있을 때 interrupt() 메소드가 실행되면 즉시 InterruptedException 예외가 발생하지 않는다. 스레드에 인터럽트가 예약이 된 후 스레드가 계속 실행이 되다가 sleep()이나 wait(), join() 같은 메소드를 만나서 일시 정지 상태(Non-Runnable)가 되면 즉시 InterruptedException을 발생 시키고 정상 종료 시킬 수 있다.
이는 스레드가 언제나 중단될 수 없기때문에 일단 예약을 해놓는 것이라고 한다.
스레드가 일시 정지 상태가 되지 않는다면 interrupt() 메소드 호출은 아무런 의미가 없다.
아래 실습을 통해 알아보도록 하자.
실습
public class InterruptTest extends Thread{
@Override
public void run() {
for(int i=0 ; i<3 ; i++){
System.out.println(i+1+". before sleep...");
}
try {
sleep(1000);
System.out.println("sleep 뒤");
} catch (InterruptedException e){
System.out.println("InterruptedException 발생");
}
System.out.println("끝나고...");
}
public static void main(String[] args) throws InterruptedException{
InterruptTest t = new InterruptTest();
t.start();
t.interrupt();
// t 스레드가 종료할 때 까지 main Thread가 기다림
// join이 생략되면 "Main Thread 종료"가 제일 먼저 출력
t.join();
System.out.println("Main Tread 종료...");
}
}
스레드를 호출시켜서 실행시킨 후 interrupt()를 사용해 인터럽트를 예약했을 때, sleep()을 만나면 InterruptedException이 발생하는 것을 확인할 수 있다.
interrupt() 코드를 삭제한 후 확인해보면 예외는 발생하지 않고 다음 작업을 진행하는 것을 알 수 있었다.
실습2
궁금해져서 스레드 두개를 생성해서 하나는 인터럽트를 예약하고 하나는 인터럽트 예약을 하지않고 실행해 보았다.
public class InterruptTest extends Thread{
int i;
public InterruptTest(int i) {
this.i =i;
}
@Override
public void run() {
for(int i=0 ; i<3 ; i++){
System.out.println(i+1+". before sleep... " + this.i);
}
try {
sleep(1000);
System.out.println("sleep 뒤..."+this.i);
} catch (InterruptedException e){
System.out.println("InterruptedException 발생");
}
System.out.println("끝나고..."+this.i);
}
public static void main(String[] args) throws InterruptedException{
InterruptTest t = new InterruptTest(1);
t.start();
t.interrupt();
InterruptTest t2 = new InterruptTest(2);
t2.start();
// t 스레드가 종료할 때 까지 main Thread가 기다림
// join이 생략되면 "Main Thread 종료"가 제일 먼저 출력
t.join();
System.out.println("Main Tread 종료...");
}
}
인터럽트를 예약한 스레드만 예외가 발생하는 것을 확인할 수 있었다.
'knowledge > computer science' 카테고리의 다른 글
[네트워크] 쿠키와 세션 (1) | 2024.02.13 |
---|---|
[네트워크] TCP와 UDP (1) | 2024.02.06 |
[DB] 여러 트랜잭션이 경쟁하면 생기는 문제 (0) | 2024.02.01 |
[OS][Java] 쓰레드(Thread) (1) | 2024.01.23 |
[OS] 프로세스 간 통신 방법(IPC: Inter Process Communication) (0) | 2024.01.16 |