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("자원 종");
}
}
}
runFlag
를 사용해서 work
스레드에 작업 중단을 지시할 수 있다.sleep(3000)
을 사용했다.main
스레드는 4초 뒤에 작업 중단을 지시한다.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] 자원 종
main
스레드가 runFlag=false
를 통해 작업 중단을 지시해도, work
스레드가 즉각 반응하지 않는다.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);
}
main
스레드가 runFlag
를 false
로 변경해도, work
스레드는 sleep(3000)
을 통해 3초간 잠들어 있다.while(runFlag)
코드를 실행 해야, runFlag
를 확인하고 작업을 중단할 수 있다.