쓰레드의 스케쥴링 관련 메서드
상태 | 설명 |
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
'Java > Java' 카테고리의 다른 글
(JAVA) 쓰레드의 실행제어 - suspend(), resume(), stop(), yield() (0) | 2020.01.25 |
---|---|
(JAVA) 쓰레드의 실행제어 - interrupt(), interrupted() (0) | 2020.01.25 |
(JAVA) 데몬쓰레드 (0) | 2020.01.23 |
(JAVA) Integer.parseInt 내부 뜯어보기 (0) | 2020.01.22 |
(JAVA) String.equals() 내부 뜯어보기 (0) | 2020.01.21 |