본문 바로가기

Programming/JAVA

멀티 스레드(6) - 스레드 상태 제어 6 : 스레드의 안전한 종료 2

 

 

 

 

 

○ interrupt( ) 메서드를 이용하는 방법

 

이번에는 interrupt( ) 메서드를 사용해 스레드를 종료하는 방법을 살펴보겠습니다. 우선 interrupt( )의 사용 방법을 요약하면, 이 interrupt( ) 메서드는 어떤 메서드가 일시 정지 상태에 있을 때 InterruptedException 예외를 발생시키고, 이를 통해 run( ) 메서드를 종료시키는 역할을 하게 됩니다. 

 

예를 들어, ThreadA에서 ThreadB의 인스턴스를 생성하고 threadB.start( )를 실행하면 ThreadB에서 run( )이 실행됩니다. 그러다가 ThreadB의 run( ) 메서드 내의 while문 안에서 Thread.sleep(1)이 실행되는 순간 일시정지 상태가 되고, 이 때  ThreadA에서는 threadB.interrupt( )를 실행합니다. 그럼 ThreadB에서는 순간 run에서의 try를 빠져나가 catch(InterruptedException e) { }로 빠져나가게 되고, 스레드 자원정리와 함께 run( ) 메서드를 정상 종료하게 되는 것입니다. 

 

대략 원리를 살펴보았으니, 예제를 살펴보겠습니다. PrintThread2를 실행한다음, 1초 후에 PrintThread2를 멈추도록 interrupt( ) 메서드를 호출하는 예제입니다. 

 

 

public class PrintThread2 extends Thread {
	public void run() {
		try {
			while(true) {
				System.out.println("실행 중...");
				Thread.sleep(1);
			}
		} catch(InterruptedException e) {}
		
		System.out.println("자원 정리");
		System.out.println("실행 종료");
	}
}

 

public class ExampleMain {
	public static void main(String[] args) {
		Thread thread = new PrintThread2();
		thread.start();
		
		try { 
			Thread.sleep(1000);
		} catch (InterruptedException e) {}
		
		thread.interrupt();
	}
}

/* 출력
...
...
실행 중...
실행 중...
실행 중...
실행 중...
실행 중...
실행 중...
실행 중...
실행 중...
실행 중...
실행 중...
실행 중...
자원 정리
실행 종료
*/

 

 

실행 클래스에서 PrintThread2 스레드를 실행하고, 약 1초 후에 interrupt( ) 메서드를 실행시킵니다.