1. 인터럽트 - 시작 1

package thread.control.interrupt;

import static thread.util.MyLogger.log;
import static thread.util.ThreadUtils.sleep;

public class ThreadStopMainV1 {

    public static void main(String[] args) {

        MyTask myTask = new MyTask();
        Thread thread = new Thread(myTask, "work");
        thread.start();

        sleep(4000);
        log("작업 중단 지시 runFlag=false");
        myTask.runFlag = false;
    }

    static class MyTask implements Runnable {

        volatile boolean runFlag = true;

        @Override
        public void run() {

            while (runFlag) {
                log("작업 중");
                sleep(3000);
            }

            log("자원 정리");
            log("자원 종");
        }
    }
}

실행 결과

00:17:58.891 [     work] 작업 중
00:18:01.898 [     work] 작업 중
00:18:02.842 [     main] 작업 중단 지시 runFlag=false
00:18:04.905 [     work] 자원 정리
00:18:04.909 [     work] 자원 종

image.png

문제점

00:17:58.891 [     work] 작업 중
00:18:01.898 [     work] 작업 중
00:18:02.842 [     main] 작업 중단 지시 runFlag=false
00:18:04.905 [     work] 자원 정리 // 2초 정도 경과 후 실행
00:18:04.909 [     work] 자원 종

가장 큰 문제는 sleep()에 있다.

while(runFlag) {
		log("작업 중");
		sleep(3000);
}