void suspend()
void resume()
void stop
직접 만들어서 사용하면 된다!
이런 식으로!
불린 변수 suspended
와 stopped
가 false
일 때 while()과 if()안이 true
가 되면서 {}코드를 수행한다. 쓰레드 진행 중
suspend()
를 호출하면 불린 변수 suspended == true
로 되면서 if()안이 false
가 된다.
-> if문을 빠져나가고 while()은 아직 true
이므로 계속 while()반복문을 수행한다. {}코드 수행을 안하는 쓰레드 멈춤이지, 아직 쓰레드 종료ㄴㄴ
그러다가 resume()
을 호출하면 불린 변수 suspended == false
로 되면서 if()안이 다시 true
가 돼 {}코드를 수행한다. 쓰레드 재개
stop()
을 호출하면 불린 변수 stopped == true
되면서 while()안이 false
가 된다.
-> while문을 빠져나가 쓰레드가 종료!!
💖💖대신
volatile boolean suspended = false; //쉽게 바뀌는 변수 volatile boolean stopped = false;
로 한다!!!
volatile
??volatile
을 넣으면 복사본이 아닌 원본을 사용하게끔 한다.volatile 변수
를 하면 실행결과가 끝이 나게 된다.ex13_10
public class Ex13_10 {
public static void main(String[] args) {
RunThread10 r = new RunThread10();
Thread th1 = new Thread(r, "*");
//***Thread생성자(Runnable target, String name)
Thread th2 = new Thread(r, "**");
Thread th3 = new Thread(r, "***");
th1.start();
th2.start();
th3.start();
try {
Thread.sleep(2000);//main 2초 재우기
th1.suspend(); //th1 일시정지
Thread.sleep(2000);
th2.suspend(); //th2 일시정지
Thread.sleep(3000);
th1.resume(); //th1 재개
Thread.sleep(3000);
th1.stop(); //th1 종료
th2.stop(); //th2 종료
Thread.sleep(2000);
th3.stop(); //th3 종료
} catch (InterruptedException e) {}
}//main
}
class RunThread10 implements Runnable{
public void run() {
while(true) {
//1초마다 쓰레드의 이름을 출력하는 메소드
System.out.println(Thread.currentThread().getName());
//***getName()을 위해선 currentThread()가 필요하다!!
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}//while
}//run
}
**
***
*
**
***
*
**
***
**
***
***
***
***
*
***
*
***
*
***
***
***
물론 저 쓰레드 순서가 일정하지 않다.
public class Ex13_10_2 {
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);//main 2초 재우기
th1.suspend(); //th1 일시정지
Thread.sleep(2000);
th2.suspend(); //th2 일시정지
Thread.sleep(3000);
th1.resume(); //th1 재개
Thread.sleep(3000);
th1.stop(); //th1 종료
th2.stop(); //th2 종료
Thread.sleep(2000);
th3.stop(); //th3 종료
} catch (InterruptedException e) {}
}//main
}
class MyThread implements Runnable{
volatile boolean suspended = false;
volatile boolean stopped = false;
//volatile이 있어야 마지막에 계속 실행되지 않고 끝난다.
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) {}
}
}//while
}//run
void start() { th.start();}
void suspend() { suspended = true;}
void resume() { suspended = false;}
void stop() { stopped = true;}
}
*
***
**
*
**
***
**
*
***
**
***
**
***
***
***
*
***
*
***
*
***
*
***
***