반응형
자바에서 스레드를 강제로 종료하는 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 플래그를 통해 스레드가 스스로 종료 조건을 판단하도록 만드는 방식이 안정적입니다.
- 스레드가 종료되기 전에 반드시 리소스 정리나 저장 작업 등을 수행할 수 있도록 설계하는 것이 중요합니다.
📌정리하자면,
스레드를 종료할 때는 강제 종료보다는, 스레드가 스스로 종료를 감지하고 안전하게 마무리할 수 있도록
플래그 변수를 활용하는 방법이 바람직합니다.
이렇게 하면 리소스 누수나 동기화 문제 없이, 안정적으로 스레드를 제어할 수 있습니다.
'Java > 자바 정리' 카테고리의 다른 글
138. Vector로 멀티스레드 환경에서도 안전하게 저장하기 (1) | 2025.05.20 |
---|---|
137. ArrayList로 객체 관리하기 – Board 클래스 예제 (0) | 2025.05.20 |
136. interrupt()로 스레드 종료하기 – sleep 중인 스레드 깨우기 (0) | 2025.05.19 |
134. 스레드 간 협업 – wait()과 notify() (0) | 2025.05.19 |
133. 스레드 충돌 막기 – synchronized로 동기화 처리 (1) | 2025.05.19 |
132. 스레드 양보하기 – Thread.yield() 활용 (0) | 2025.05.19 |