JAVA3_06_suspend(), resume()

charl hi·2021년 9월 30일
0

JAVA3

목록 보기
6/9

suspend()

  • void suspend()
  • 쓰레드의 실행을 일시정지시킨다.
  • deprecated (dead-lock, 교착상태)

resume()

  • void resume()
  • suspended된(일시정지된) 쓰레드를 실행대기상태로 만든다.
  • deprecated (dead-lock, 교착상태)

stop()

  • void stop
  • 쓰레드를 완전정지시킨다. 즉시 종료
  • deprecated (dead-lock, 교착상태)

그럼 어떻게??

직접 만들어서 사용하면 된다!

이런 식으로!

  • 불린 변수 suspendedstoppedfalse일 때 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 ??
    -> CPU의 코어가 RAM에 있는 변수들(원본)의 복사본을 갖고 사용하는데, 이 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;}
}


*
***
**
*
**
***
**
*
***
**
***
**
***
***
***
*
***
*
***
*
***
*
***
***



Ref

0개의 댓글