Java/자바 정리

135. 안전하게 스레드 종료시키기 – 플래그 활용

코딩하는냥이 2025. 5. 19. 14:45
반응형

자바에서 스레드를 강제로 종료하는 stop() 메서드는 이미 Deprecated 처리되어 있으며,
사용할 경우 리소스 정리가 되지 않거나 예기치 않은 동작이 발생할 수 있습니다.
따라서 일반적으로는 플래그 변수를 사용하여 스레드가 스스로 종료하도록 유도하는 방식이 권장됩니다.


📦 PrintThread.java

package ch14.sec07;

public class PrintThread extends Thread {
	private boolean stop;

	public void setStop(boolean stop) {
		this.stop = stop;
	}
	
	public void run() {
		while (!stop)
			System.out.println("실행중");

		System.out.println("리소스 정리");
		System.out.println("실행 종료");
	}
}

📌 예제 코드

package ch14.sec07;

public class SafeStopExample {
	public static void main(String[] args) {
		PrintThread printThread = new PrintThread();
		printThread.start();
		
		try {
			Thread.sleep(3000);  // 3초 동안 스레드 실행
		} catch (Exception e) {
			// 예외 처리 생략
		}
		
		printThread.setStop(true);  // 종료 요청
	}
}

💻 실행 결과

실행중
실행중
...
(3초간 반복)
리소스 정리
실행 종료

※ "실행중" 메시지가 반복되다가, 3초 후 "리소스 정리"와 "실행 종료"가 출력됩니다.


💬 코드 설명

  • PrintThread 클래스는 Thread를 상속받아 run() 메서드 안에서 무한 루프를 실행합니다.
  • 외부에서 stop 변수를 true로 설정하면 while (!stop) 조건이 false가 되어 루프가 종료됩니다.
  • run() 메서드가 끝나면서 "리소스 정리"와 "실행 종료" 메시지가 출력되며 스레드가 정상 종료됩니다.
  • stop() 메서드를 사용하지 않고, 스레드 내부에서 상태를 감지해 종료하도록 설계된 안전한 구조입니다.

💡 포인트 정리

  • stop() 메서드는 위험하기 때문에 사용을 피해야 합니다.
  • boolean 플래그를 통해 스레드가 스스로 종료 조건을 판단하도록 만드는 방식이 안정적입니다.
  • 스레드가 종료되기 전에 반드시 리소스 정리나 저장 작업 등을 수행할 수 있도록 설계하는 것이 중요합니다.

📌정리하자면, 

스레드를 종료할 때는 강제 종료보다는, 스레드가 스스로 종료를 감지하고 안전하게 마무리할 수 있도록
플래그 변수를 활용하는 방법이 바람직합니다.
이렇게 하면 리소스 누수나 동기화 문제 없이, 안정적으로 스레드를 제어할 수 있습니다.