suspend(), resume(), stop()
suspend(), resume(), stop()
- 쓰레드의 실행을 일시정지, 재개, 완전정지 시킨다.
쓰레드를 생성한다음, start()를 하면 실행 대기상태(줄서기)에 있다가 자기 순서때 실행을 하다가 작업을 다 못 마치면 뒤로가서 다시 줄을 서게 된다. 자기 작업이 끝나거나 stop()메서드를 호출하면 쓰레드가 종료된다. 그리고나서 쓰레드가 소멸되게 된다.
쓰레드는 작업을 마칠 때 까지 줄서기와 실행을 반복하는 것이다.
그러다가 작업이 끝나면 소멸되던가, stop()메서드를 호출하면 강제로 소멸되는 것이다.
실행중에 suspend() 일시정지라는 메서드를 호출하면, 쓰레드가 통안에 들어가서 WATING(일시정지)상태가 된다.
resume()을 호출하면 일시 정지 상태에서 벗어나서 다시 나와서 줄을 서게 된다.
즉, resume()과 suspend()는 완전히 반대되는 메서드다.
위 메서드들을 사용하면 쓰레드제어에 편리하다.
그런데, 이 메서드들이 deprecated되었다. (사용하지 않을 것을 권장)
그 이유는, dead-lock (교착상태) 을 일으킬 가능성이 있기 때문이다.
교착상태는, 서로 두 쓰레드가 자신에게 필요한 것들을 가지고 있어서 진행이 되지 않는 것이다.
A쓰레드가 B쓰레드가 원하는 것을 가지고 있고, B쓰레드가 A쓰레드가 원하는 것을 가지고 있어서 작업이 진행되지 않는 것이 예이다.
위 메서드들이 교착상태를 일으키기 쉽다는 이유로인해 사용하지 않을 것을 권장한다.
- suspend(), resume(), stop()은 교착상태에 빠지기 쉬워서 deprecated되었다.
그래서 Thread 클래스에 정의된 suspend(), resume(), stop() 대신에 우리가 직접 아래와 같이 메서드를 작성해 주는 것이 좋다.
변수 두개를 선언했다.
suspended는 "쓰레드가 일시정지 상태인가?"를 나타내고
stopped는 "쓰레드가 정지 되었는가?" 라는 상태를 저장하기 위한 변수이다.
run에서 while문과 if문이 있는데,
이 안에다가 쓰레가 작업할 코드를 넣으면 된다.
현재 stopped는 false이므로 !stopped는 true다.
마찬가지로 !suspended에도 느낌표가 붙었으므로 true다.
이 코드를 반복해서 수행하는 것이다.
그러다가 suspend()가 호출되면 suspended를 true로 바뀐다.
그러면 if문이 true에서 false로 바뀐다.
그러면 if문이 수행되지 않는채로 반복문을 계속 돌게된다.
아직 쓰레드가 종료되지 않은 것이다.
그러다가 resuem()을 호출하면 suspende가 false가 되서 if문이 ture가 되어 작업을 수행하게 된다.
만약에 stop()을 호출하면 while문이 true에서 false가 된다. 그러면 while조건문이 false이므로 while문을 벗어나서 쓰레드가 종료되게 된다.
[Ex13_10]
public class Ex13_10 {
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) {
}
}
}
class MyThread implements Runnable {
volatile boolean suspended = false; // volatile은 변수값이 쉽게 바뀌는 변수라는 뜻이다. (캐시에 복사본 사용 못하게 하는 것)
volatile boolean stopped = false;
Thread th;
MyThread(String name) {
th = new Thread(this, name); // Thread(Runnalbe r, String name)
}
void start() {
th.start();
}
void stop() {
stopped = true;
}
void suspend() {
suspended = true;
}
void resume() {
suspended = false;
}
@Override
public void run() {
while (!stopped) {
if (!suspended) {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
} // run()
}
[volatile]
'JAVA' 카테고리의 다른 글
쓰레드의 동기화 (0) | 2022.07.09 |
---|---|
join(), yield() (0) | 2022.07.07 |
sleep(), iterrupt() (0) | 2022.07.01 |
데몬 쓰레드, 쓰레드의 상태 (0) | 2022.06.29 |
쓰레드의 우선순위, 쓰레드 그룹 (0) | 2022.06.12 |
댓글
이 글 공유하기
다른 글
-
쓰레드의 동기화
쓰레드의 동기화
2022.07.09 -
join(), yield()
join(), yield()
2022.07.07 -
sleep(), iterrupt()
sleep(), iterrupt()
2022.07.01 -
데몬 쓰레드, 쓰레드의 상태
데몬 쓰레드, 쓰레드의 상태
2022.06.29