스레드는 자신의 run() 메소드가 보두 실행되면 자동적으로 종료되지만 경우에 따라서 실행 중인 스레드를 즉시 종료할 필요가 있다
스레드를 강제종료시키기 위해 thread는 stop() 메소드를 제공하고 있으나 더이상 사용하지 않는다
그 이유는 스레드를 갑자기 종료하게 되면 사용중이던 리소스들이 불안전한 상태로 남겨지기 때문이다
* 리소스 : 파일, 네트워크 연결 등
스레드를 안전하게 종요하는 방법은 사용하던 리소스들을 정리하고 run() 메소드를 빨ㄹ ㅣ종료하는 것이다
interrupt() 메서드는 스레드에 인터럽트(중단요청)을 모내는 메서드이다
즉시 멈추는 게 아니라 스레드가 중단되었음을 알리는 신호를 보낸다
스레드가 이 신호를 받으면 스스로 종료를 준비할 수 있게한다
class MyThread extends Thread {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
// 스레드가 작업하는 코드 (예: 파일 읽기, 계산 등)
System.out.println("스레드 작업 중...");
Thread.sleep(1000); // 1초 동안 대기 (일시정지)
} catch (InterruptedException e) {
// 인터럽트 발생 시 예외 처리
System.out.println("인터럽트가 발생하여 스레드를 종료합니다.");
break; // 루프 종료
}
}
System.out.println("스레드가 정상적으로 종료되었습니다.");
}
}
// isInterrupted() 는 현재 스레드가 인터럽트 상태인지 확인한다
이 메서드가 true를 반환하면 스레드가 인터럽트를 받았다는 의미이다
// sleep() 메서드를 사용하면 스레드가 일정시간동안 멈눈다
이때 인터럽트가 발생하면 InterruptedException 예외가 발생한다
예외가 발생하면스레드는 루프를 빠져나와 종료할 수 있다
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 스레드 시작
try {
Thread.sleep(3000); // 3초 후에 인터럽트 보내기
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
thread.interrupt(); // 스레드에 중단 요청
}
}
// interrupt() 호출하면 스레드는 인터럽트 신호를 받고
isInterrupted()**나 InterruptedException 예외를 통해 이를 감지한다
스레드가 인터럽트를 감지하고 정상적으로 루프를 빠져나와서 종료한다
interrupt() 스레드에 인터럽트 신호를 보내서 스레드가 스스로 종료하도록 유도하는 방법
'Java' 카테고리의 다른 글
| Java_스레드풀(threadPool), 스레드풀의 종료 (0) | 2024.10.17 |
|---|---|
| Java_데몬 스레드 (2) | 2024.10.17 |
| Java_Wait() notify() 이용한 스레드 제어 (1) | 2024.10.17 |
| Java_스레드 상태 (0) | 2024.10.17 |
| Java_스레드 이름 (0) | 2024.10.17 |