- 쓰레드의 실행을 일시정지, 재개, 완전정지 시킨다.
- suspend(), resume(), stop()은 교착상태에 빠지기 쉬워서 deprecated 되었다.
- 다음과 같은 방식으로 직접 구현할 수 있다.
class MyThread implements Runnable {
volatile boolean suspended = false;
volatile boolean stopped = false;
Thread th;
MyThread(String name){
th = new Thread(this, name);
}
public void run() {
while(!stopped) {
if(!suspended) {
System.out.println(Thread.currentThread().getName());
try{
Thread.sleep(1000);
} catch(InterruptedException e) {}
}
}
}
public void suspend() { suspended =true; }
public void resume() { suspended =false; }
public void stop() { stopped = true; }
}
public practice {
public static void main(String args[]){
MyThread th1 = new MyThread("*");
MyThread th2 = new MyThread("**");
MyThread th3 = new MyThread("***");
th1.start();
th2.start();
th3.start();
try {
Thread.sleep(2000);
th1.suspend();
Thread.sleep(2000);
th2.suspend();
Thread.sleep(3000);
th1.resume();
Thread.sleep(3000);
th1.stop();
th2.stop();
Thread.sleep(2000);
th3.stop();
} catch (InterruptedException e) {}
}
}
volatile
- RAM에 올라간 변수 suspended 값 false를 CPU의 코어 내에 cache 메모리가 더 빠른 작업을 위해 복사해서 갖고 있다.
- RAM이 갖고 있는 원본 suspended의 값이 false에서 true로 변할 때, cache 메모리의 복사본 suspend의 값은 변하지 않을 수 있다.
- volatile을 붙이면 복사본을 사용하지 않고, RAM의 원본을 직접 읽어온다.
- 자주 바뀌는 값이니까 복사본 쓰지않고, 원본에서 값을 가져다 쓰라는 뜻.