패턴 명칭
Safe Termination
필요한 상황
스레드의 종료를 안전하게 하기 위한 패턴이다. 스레드는 기본적으로 stop 매서드를 제공하지만, 이 매서드는 안정성 문제로 deprecated 되었다. 스레드는 자신의 코드가 모두 실행되고 종료되는 것이 가장 이상적이지만, 실행 중간에 종료되어야 할 상황에서 안전하게 종료될 수도 있어야 한다.
예제 코드
먼저 수를 계속 카운팅하는 스레드 Worker를 기동시키는 아래의 코드가 있다.
package tstThread; public class Main { public static void main(String[] args) { System.out.println("BEGIN"); Worker worker = new Worker(); worker.start(); try { Thread.sleep(2000); System.out.println("[stopRequest BEGIN]"); worker.stopRequest(); System.out.println("[stopRequest END]"); worker.join(); } catch(InterruptedException e) { //. } System.out.println("END"); } }
Worker 스레드는 다음과 같다.
package tstThread; public class Worker extends Thread { private volatile boolean bStop = false; public void stopRequest() { bStop = true; interrupt(); } public void run() { try { for(int i=0; true; i++) { if(bStop) break; System.out.println("Counting: " + i); Thread.sleep(100); } } catch(InterruptedException e) { //. } finally { release(); } } private void release() { System.out.println("SAFE TERMINATION"); } }
bStop 변수가 스레드를 안전하게 종료시키는 장치인데, volatile로 선언되었다. 이 변수는 stopRequest 매서드로 인해 true로 설정되며, interrupt 매서드의 호출을 동반한다. interrupt 매서드의 호출은 wait, sleep로 인해 스레드가 대기하는 상황에서도 안전하게 스레드를 종료시키기 위함이다. 실행 결과는 다음과 같다.
BEGIN Counting: 0 Counting: 1 Counting: 2 Counting: 3 Counting: 4 Counting: 5 Counting: 6 Counting: 7 Counting: 8 Counting: 9 Counting: 10 Counting: 11 Counting: 12 Counting: 13 Counting: 14 Counting: 15 Counting: 16 Counting: 17 Counting: 18 Counting: 19 [stopRequest BEGIN] [stopRequest END] SAFE TERMINATION END