본문 바로가기
JAVA공부/2-쓰레드

쓰레드 제어문(3)

by 으노으뇨 2021. 10. 14.
728x90
반응형
SMALL

suspend(), resume(), stop()

쓰레드의 실행을 일시정지, 재개, 완전정지 시키는 메서드에 대해 알아보자!

void suspend() //쓰레드를 일시정지 시킨다.
void resume() //suspend()에 의해 일시정지된 쓰레드를 실행대기 상태로 만든다. 
void stop() //쓰레드를 즉시 종료시킨다.

우선 쓰레드의 생성주기를 다시 복습해보자

쓰래드는 생선된다 (new!)

그리고 start() 당한다. 

그리고 자기차례때 줄서다가 진짜 실행이되고, 

그사이사이 waiting, bloked 당하고 시간이 다되어 종료되되고 그런다.

그런데 suspend, resume, stop 메서드들은 쓰레드의 실행을 제어하는 가장 손쉬은 방법이지만, 

교착상태를 일으키기 쉽게 작성되어있어서 권장하지않는 derecated가 되어있다.

교착상태란? 더보기 클릭!

더보기

교착상태, Dead-Lock? : 교착 상태(膠着狀態, 영어: deadlock)란 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태를 가리킨다. 예를 들어 하나의 사다리가 있고, 두 명의 사람이 각각 사다리의 위쪽과 아래쪽에 있다고 가정한다. 이때 아래에 있는 사람은 위로 올라 가려고 하고, 위에 있는 사람은 아래로 내려오려고 한다면, 두 사람은 서로 상대방이 사다리에서 비켜줄 때까지 하염없이 기다리고 있을 것이고 결과적으로 아무도 사다리를 내려오거나 올라가지 못하게 되듯이, 전산학에서 교착 상태란 다중 프로그래밍 환경에서 흔히 발생할 수 있는 문제이다. 이 문제를 해결하는 일반적인 방법은 아직 없는 상태이다.

   @Deprecated(since="1.2", forRemoval=true)
    public final void resume() {
        checkAccess();
        resume0();
    }
    @Deprecated(since="1.2")
    public final void stop() {}
    
        @Deprecated(since="1.2", forRemoval=true)
    public final void suspend() {
        checkAccess();
        suspend0();
    }

이렇게 되어있다. 

그러나 이걸 주의해야할 뿐이지 쓰지말라는건 아니다!

그리고 이 메서드들은 구현하기 쉽게 되어있다.

class threadEx implements Runnable {
	boolean suspended = false;
	boolean stopped = false;

	public void run() {
		while (!stopped) {
			if (!suspended) {
				/*
				 * 쓰레드가 수행할 코드를 작성하세요
				 */
			}
		}
	}

	public void suspend() {
		suspended = true;
	}

	public void resume() {
		suspended = false;
	}

	public void stop() {
		stopped = true;
	}
}

실제론 좀더 복잡하다. 그러나 간단하게 구현해보니 저렇게 되었다.

package ch13.Thread;
@SuppressWarnings("deprecation")
public class ThreadEx15 {
	public static void main(String[] args) {
		RunImpleEx15 r = new RunImpleEx15();
		Thread t1 = new Thread(r, "*");
		Thread t2 = new Thread(r, "**");
		Thread t3 = new Thread(r, "***");
		t1.start();
		t2.start();
		t3.start();
		try {
			Thread.sleep(2000);
			t1.suspend();
			Thread.sleep(2000);
			t2.suspend();
			Thread.sleep(2000);
			t1.resume();
			Thread.sleep(2000);
			t1.stop();
			t1.stop();
			Thread.sleep(1000);
			t3.stop();
		} catch (InterruptedException e) {
		}
	}
}
class RunImpleEx15 implements Runnable {
	@Override
	public void run() {
		while (true) {
			System.out.println(Thread.currentThread().getName());
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
			}
		}
	}
}

쓰레드 3개를 생성하고 , 각 쓰레드마다 이름을 지어준다. 그리고 시간초마다 이름을 찍어 

별을 찍게 만들었다.

메인 쓰레드를 중간중간재워서 2초마다 한번에 나오도록 하였다.


이제는 내가 아까 간단하게 구현해본 stop, suspend, resume 를 이용해서 동일한 결과를 얻도록 하였다.

package ch13.Thread;

@SuppressWarnings("deprecation")
public class ThreadEx15 {
	public static void main(String[] args) {
		MyThread t1 = new MyThread("*");
		MyThread t2 = new MyThread("**");
		MyThread t3 = new MyThread("***");
		t1.start();
		t2.start();
		t3.start();
		try {
			Thread.sleep(2000);
			t1.suspend();
			Thread.sleep(2000);
			t2.suspend();
			Thread.sleep(2000);
			t1.resume();
			Thread.sleep(2000);
			t1.stop();
			t2.stop();
			Thread.sleep(1000);
			t3.stop();
		} catch (InterruptedException e) {
		}
	}
}

class MyThread implements Runnable {
	volatile boolean suspended = false;
	volatile boolean stopped = false;
	// volatile = 변수값이 쉽게바뀐다. 
	Thread th;

	MyThread(String name) {
		th = new Thread(this, name);
	}

	void start() {
		th.start();
	}

	void stop() {
		this.stopped = true;
	}

	public void suspend() {
		this.suspended = true;
	}

	public void resume() {
		this.suspended = false;
	}

	@Override
	public void run() {
		while (!stopped) {
			if (!suspended) {
				System.out.println(Thread.currentThread().getName());
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
				}
			}
		}
	}
}

 

728x90
반응형
LIST

'JAVA공부 > 2-쓰레드' 카테고리의 다른 글

쓰레드의 동기화  (0) 2021.10.15
쓰레드 제어문(4)  (0) 2021.10.14
쓰레드 제어문(2)  (0) 2021.10.13
쓰레드 제어문(1)  (0) 2021.10.13
쓰레드 제어문(1)  (0) 2021.10.13

댓글