본문 바로가기

Java/Java

(JAVA) 쓰레드의 실행제어 - sleep

쓰레드의 스케쥴링 관련 메서드

상태 설명
NEW 쓰레드가 생성되고 아직 start()기 호출되지 않은 상태
RUNNABLE 실행 중 또는 실행 가능한 상태
BLOCKED 동기화블럭에 의해서 일시정지된 상태 (lock이 풀릴 때까지 기다리는 상태)
WAITING, TIMED_WAITING 쓰레드의 작업이 종료되지는 않지만 실행가능하지 않은 일시정지 상태
TERMINATED 쓰게드의 작업이 종료된 상태

  • 쓰레드 생성 후 start()를 호출하면 바로 실행되는 것이 아닌 자신의 차례가 될 때까지 기다린다. (QUEUE)
  • 실행 대기상태에 있다가 자신의 차례가 되면 실행 상태가 된다.
  • 주어진 실행상태가 다 되거나 yield()를 만나면 다시 실행 대기상태가 된다. 
  • 실행 중에 susupend() sleep() wait() join() I/O block을 만나면 다시 일시정지 상태가 된다.
  • time-out resume() notify() interrupt()를 만나면 다시 실행 대기 상태로 돌아간다.
  • 실행을 모두 마치거나 stop()을 호출하면 쓰레드를 소멸된다.

sleep(long millis) 

: 일정시간동안 쓰레드를 멈추게 한다.

public static native void sleep(long var0) throws InterruptedException;

public static void sleep(long millis, int nanos) throws InterruptedException {
    if (millis < 0L) {
        throw new IllegalArgumentException("timeout value is negative");
    } else if (nanos >= 0 && nanos <= 999999) {
        if (nanos >= 500000 || nanos != 0 && millis == 0L) {
            ++millis;
        }

        sleep(millis);
    } else {
        throw new IllegalArgumentException("nanosecond timeout value out of range");
    }
}

예시 코드

th1 쓰레드 와 th2 쓰레드를 실행한다. 

이때 th1 쓰레드는 2초 동안 작업을 멈춘다.

public class ThreadScheduling {
    public static void main(String[] args) {
        ThreadScheduling_1 th1 = new ThreadScheduling_1();
        ThreadScheduling_2 th2 = new ThreadScheduling_2();

        th1.start();
        th2.start();

        try {
            th1.sleep(2000);
        } catch (InterruptedException e) {
        }
        System.out.print("<<main 종료>>");
    }
}
class ThreadScheduling_1 extends Thread{
    @Override
    public void run() {
        for (int i=0;i<300;i++) {
            System.out.print("-");
        }
        System.out.print("<<th1 종료>>");
    }
}
class ThreadScheduling_2 extends Thread{
    @Override
    public void run() {
        for (int i=0;i<300;i++) {
            System.out.print("|");
        }
        System.out.print("<<th2 종료>>");
    }
}

 

실행결과

생각을 해보니 th1 쓰레드가 2초 동안 작업을 멈추었으니 가장 늦게 종료되어야 하는 게 정상이지만 결과는 그렇지 않다.

이유는 sleep은 항상 현재 실행 중인 쓰레드에 대해서 작동하기 때문이다. (현재 실행중인 Thread = main Thread)

 

class ThreadScheduling_1 extends Thread{

    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {

        }
        for (int i=0;i<300;i++) {
            System.out.print("-");
        }
        System.out.print("<<th1 종료>>");
    }
}

이렇게 th1 내부에 실행되어질 때 sleep을 선언하면 th1 쓰레드가 가장 늦게 호출되어진다.


코드 참조

https://github.com/mike6321/PURE_JAVA/tree/master/Thread

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com