728x90
쓰레드의 실행제어
멀티쓰레드 프로그래밍은 동기화(synchronization)와 스케줄링(scheduling) 등의 여러가지 이유로 어렵습니다.
앞서(https://ttl-blog.tistory.com/791) 우선순위를 통한 쓰레드간의 스케줄링을 하는 방법을 간단히 살펴보았으나, 이것만으로는 너무 부족합니다.
이제부터 우선순위 이외에도 쓰레드의 스케줄링과 관련된 메서드들을 살펴보도록 하겠습니다.
sleep - 일시정지
static void sleep(long millis)
지정된 시간 동안 쓰레드를 일시정지시킵니다.
지정된 시간이 지난 이후에는 자동으로 실행대기 상태로 변환됩니다.
sleep은 항상 현재 실행 중인 쓰레드에 대해 작동합니다.
이러한 이유로 static으로 선언되어 있으며, 참조변수를 이용하여 호출한다면 예상대로 동작하지 않을 것입니다.
public class Example {
public static void main(String[] args) throws InterruptedException {
System.out.println("쓰레드 일시정지해유");
new Thread(new Run()).start();
Thread.sleep(1000);
System.out.println("쓰레드 일시정지 끝났어유");
}
static class Run implements Runnable {
@Override
public void run() {
System.out.println("Run 일시정지해유 ");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Run 일시정지 끝 ");
}
}
}
join - 다른 쓰레드의 작업을 기다림
void join()
void join(long millis)
자신이 하던 작업을 멈추고, 지정된 시간 동안 다른 쓰레드가 실행되도록 합니다.
지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 제어권이 돌아와 다른 작업을 계속합니다.
인자를 사용하지 않으면 작업이 종료될때까지 기다립니다.
호출한 쓰레드는 실행대기 상태가 됩니다.
public class Example {
public static void main(String[] args) throws InterruptedException {
System.out.println("메인 쓰레드 시작");
System.out.println("쓰레드 생성");
Thread thread = new Thread(new Run());
thread.start();
//thread.join(2000);
thread.join();
System.out.println("메인 쓰레드 끝");
}
static class Run implements Runnable {
@Override
public void run() {
System.out.println("Run Run!");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("END");
}
}
}
interrupt - 일시정지
void interrupt()
sleep()이나 join()에 의해 일시정지상태인 쓰레드를 깨워서 실행대기 상태로 만듭니다.
해당 쓰레드에서는 interruptedException이 발생하여 일시정지상태를 벗어납니다.
interrupt()가 호출되면 쓰레드 내부 interrupted 필드의 값을 false에서 true로 바꿉니다.
메서드 | 설명 |
void interrupt() | 쓰레드의 interrupted 상태를 false에서 true로 변경합니다. |
boolean isInterrupted() | 쓰레드의 interrupted 상태를 반환합니다. |
static boolean interrupted() | 쓰레드의 interrupted 상태를 반환한 후 false로 변경합니다. |
import java.util.concurrent.ExecutionException;
public class Example {
public static void main(String[] args) {
System.out.println("메인 쓰레드 시작");
System.out.println("쓰레드 생성");
Thread thread = new Thread(new Run(Thread.currentThread()));
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
System.out.println("일시정지 해제!!");
}
System.out.println("메인 쓰레드 끝");
}
static class Run implements Runnable {
Thread main;
public Run(Thread main) {
this.main = main;
}
@Override
public void run() {
System.out.println("interrupt 호출");
main.interrupt();
System.out.println("Run Run!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Run END");
}
}
}
stop - 즉시 종료
void stop()
쓰레드를 즉시 종료시킵니다.
1.2버전 이후로 Deprecated되어 사용을 권장하지 않습니다.
suspend - 일시정지
void suspend()
쓰레드를 일시정지시킵니다.
resume()을 호출하면 다시 실행대기 상태가 됩니다.
이 방법은 본질적으로 교착상태(deadlock)가 발생하기 쉬워 더이상 사용되지 않습니다.
1.2버전 이후로 Deprecated되었습니다.
yeild - 실행시간 양보
static void yeild()
실행 중에 자신에게 주어진 실행시간을 다른 쓰레드에게 양보하고 자신은 실행대기 상태가 됩니다.
yeild는 sleep과 마찬가지로 항상 현재 실행 중인 쓰레드에 대해 작동합니다.
이러한 이유로 static으로 선언되어 있으며, 참조변수를 이용하여 호출한다면 예상대로 동작하지 않을 것입니다.
쓰레드의 상태
상태 | 설명 |
NEW | 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태입니다. |
RUNNABLE | 실행 중 또는 실행 가능한 상태입니다. |
BLOCKED | 동기화(synchronized) 블럭에 의해서 일시정지된 상태 (lcok이 풀릴 때까지 기다리는 상태) |
WAITING | 쓰레드의 작업이 종료되지는 않았지만 실행가능(runnable)하지 않은 일시정지 상태. |
TIMED_WAITING | 쓰레드의 작업이 종료되지는 않았지만 실행가능(runnable)하지 않은 일시정지 상태. 일시정지 시간이 지정된 경우 |
TERMINATED | 쓰레드의 작업이 종료된 상태 |
728x90
'☕️ Java > 기본' 카테고리의 다른 글
[Java] Thread (8) - 쓰레드의 동기화(2) - Lock과 Condition (3) | 2022.07.15 |
---|---|
[Java] Thread (7) - 쓰레드의 동기화(1) - synchronized와 wait(), notify() (0) | 2022.07.15 |
[Java] Thread (5) - 데몬 쓰레드 (0) | 2022.07.13 |
[Java] Thread (4) - 쓰레드의 우선순위 (0) | 2022.07.13 |
[Java] Thread (3) - 싱글쓰레드와 멀티쓰레드 (0) | 2022.07.09 |