Java

Java_스레드의 안전종료

ssmm95 2024. 10. 17. 13:08

스레드는 자신의 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