안전하지 않은 스레드 종료에서 협력적 취소로
Thread.stop()과 임시 공유 플래그를 인터럽트를 인식하는 작업 취소로 대체합니다.
코드 비교
✕ Forced thread termination
Thread worker = new Thread(this::runTask); worker.start(); // May stop the thread while shared state is inconsistent. worker.stop();
✓ Future cancellation
Future<?> worker = executor.submit(this::runTask); // Requests interruption; the task must cooperate. worker.cancel(true);
이 코드에 문제가 있나요? 알려주세요.
모던 방식이 더 나은 이유
불변성 유지
작업은 취소를 위해 설계된 코드 경로에서만 중단됩니다.
표준화된 제어
Future는 실행, 완료, 취소를 함께 표현합니다.
조합 가능
인터럽트는 블로킹 큐, 락, executor, 가상 스레드와 함께 작동합니다.
이전 방식
Thread.stop()
모던 방식
Future.cancel(true)
JDK 버전
5
난이도
고급
JDK 지원
안전하지 않은 스레드 종료에서 협력적 취소로
사용 가능
Future와 ExecutorService는 JDK 5 (2004년 9월)부터 사용할 수 있습니다.
동작 원리
Thread.stop()은 모니터를 소유하고 있거나 공유 상태를 갱신하는 도중에 코드를 종료시킬 수 있어 객체가 손상된 채로 남을 수 있습니다. 현대적인 취소는 협력적입니다. 인터럽트로 Future를 취소하고, 가능하면 InterruptedException을 전파하며, 전파할 수 없는 경우 인터럽트 상태를 복원하고, 작업이 안전한 취소 지점에 도달하도록 설계합니다.
관련 문서
증명