프로그래밍 정리/자바

NotRunnable 상태 만들기

주누다 2013. 6. 17. 13:38
반응형

- 우선권은 어떤 쓰레드가 Run 상태를 더 많이 차지할 것인가의 문제. 

즉 우선권이 높으면 그만큼 Run 상태에 자주 들어갈 수 있음. 쓰레드가 NotRunnable 상태가 될 수 있는 두가지 방법.


- 쓰레드를 NotRunnable 상태로 만드는 방법

-> sleep()을 이용해서 일정시간 동안만 대기시키는 방법(자동)

-> wait()와 notify()를 이용해서 대기와 복귀를 제어하는 방법(수동)


- sleep()과 wati()는 쓰레드를 NotRunnable 상태로 만듬. 

-> sleep()의 경우는 주어진 시간 만큼만 NotRunnable 상태로 보내며, 시간이 완료되면 자동으로 Runnable 상태로 복귀.

-> wait()의 경우에는 사용자가 직접 wait()를 호출해서 NotRunnable 상태로 만들며, Runnable 상태로 되돌아오기 위해서는 notify()를 호출해 주어야 함.

-> sleep()은 자동이며 wait()와 notify()는 수동으로 처리.


- sleep()의 사용

-> try{

Threa.sleep(1000);        // 시간의 단위는 1/1000초

}catch(InterruptedExption e){e.printStackTrace();}


- 1초만큼 Notrunnable 상태가 되며 1초가 지난 뒤에는 자동으로 Runnable 상태로 되돌아와서 작업을 재개. sleep()은 Thread의 스태틱 메서드이기 때문에 프로그램 어디서나 사용할 수 있으며, 일시적으로 작업을 중단(대기)시키는 역할을 함.


============================================================================================================



public class NotRunnableThread extends Thread{

@Override

public void run() {

// TODO Auto-generated method stub

int i = 0;

while(i<10){

System.out.println(i + "회 : " + System.currentTimeMillis() + "\t");

i = i + 1;

try{

this.sleep(1000);

}catch (Exception e) {

// TODO: handle exception

}

}

}

}



public class NotRunnableThreadMain {


public static void main(String[] args) {

NotRunnableThread s = new NotRunnableThread();

s.start();

}

}


=========================================================================================================

- 일반적으로 쓰레드는 지속적인 작업을 목적으로 하기 때문에 일정 시간동안 작업을 멈추게 하는 것은 반드시 필요. 하나의 쓰레드가 CPU를 독점하는 것을 막기 위해서 sleep()은 간단하면서도 효과적인 방법.

- Thread를 상속받은 상태에서 sleep()을 사용할 때에는 Thread.sleep()처럼 사용하지 않아도 됨. 
-> this.sleep(1000);            // 쓰레드를 상속받아서 쓸 경우.

- run()메서드 내의 sleep()은 해당 쓰레드를 일정 시간동안 NotRunnable 상태로 만들어 버림. Notrunnable 상태가 되었을 때 다른 쓰레드가 Runnable 상태에서 CPU의 제어권을 가지게 될 확률이 높아짐. 보통의 경우에는 지금처럼 하나의 쓰레드를 제어하는 것이 아니라 여러개의 쓰레드를 동시에 제어하면서, sleep()을 이용해서 작업의 로드 밸런싱(Load Balancing)을 하게 됨.



반응형

'프로그래밍 정리 > 자바' 카테고리의 다른 글

멀티쓰레드와 문제점  (0) 2013.06.17
쓰레드 죽이기  (0) 2013.06.17
쓰레드의 우선권  (0) 2013.06.17
쓰레드의 상태  (0) 2013.06.17
ObjectOutputStream와 ObjectInputStream : transient(객체직렬화)  (0) 2013.06.07