스레드를 생성하고 시작하면 스레드는 다양한 상태를 갖게 된다.
스레드의 상태는 자동으로 변경될 수도 있고, 코드에 의해 변경될 수있다.
스레드 객체를 생성하고 start()메소드를 호출 하면 바로 실행되지 않고 실행 대기상태가 된다.
실행 대기에 있는 스레드 중 하나를 운영체제는 선택해서 실행 상태로 만든다.
실행 대기란, 언제든지 실행할 준비가 된 상태 이다.
실행 상태에서 run()메소드의 내용이 모두 실행되면 스레드의 실행이 멈추고 종료 상태가 된다.
스레드 상태
실행 대기 상태란, 메소드 호출 후 실행을 기다리고 있는 상태 이다.
실행 대기 상태에 있는 스레드 중에서 운영체제는 하나의 스레드를 선택하고 CPU가 run()메소드를 실행 하도록 한다. --> 실행 상태
실행 상태의 스레드는 run()메소드를 모두 실행하기 전에 다시 실행 대기 상태로 돌아 갈 수 있다.
스레드는 실행 대기 상태와 실행 상태를 번갈아 가면서 run()메소드를 조금씩 실행한다. 실행 상태에서 run()메소드가 종료되면, 스레드의 실행은 멈추게 된다. --> 종료 상태
스레드 상태 제어
스레드 상태 제어란, 실행 중인 스레드의 상태를 변경 하는 것이다.
스레드 상태 제어는 주어진 시간 동안 일시 정지시키는 sleep() 메소드와 스레드를 안전하게 종료 시키는 stop플래그, interrupt() 메소드를 사용한다.
- interrupt(): 일시 정지 상태의 스레드에서 InterruptedException을 발생시켜, 예외 처리 코드(catch)에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다.
- sleep(long millis): 주어진 시간 동안 스레드를 일시 정지 상태로 만든다. 주어진 시간이 지나면 자동으로 실행 대기 상태가 된다.
- stop(): 스레드를 즉시 종료 한다. 불안전한 종료를 유발하므로 사용하지 않는 것이 좋다.
주어진 시간 동안 일시 정지
실행 중인 스레드를 일정 시간 멈추게 하려면, sleep() 메소드를 사용하면 된다.
try{
Thread.sleep(1000); //1초동안 멈춤
} catch(InterrupptedException e){
//interrupt() 메소드가 호출 되면 실행
}
예시1) 3초 주기로 10번 비프음 발생
import java.awt.Toolkit;
public class SleepEx {
public static void main(String[] args) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for (int i = 0; i < 10; i++) {
toolkit.beep();
try {
Thread.sleep(3000); // 3초 동안 메인스레드 멈춤
} catch (InterruptedException e) {
}
}
}
}
스레드의 안전한 종료
Thread는 스레드를 즉시 종료하기 위해서 stop() 메소드를 이용해서 즉시 갑자기 종료 하게 하는 것이다.
하지만, 이렇게 종료하면 사용 중이던 데이터가 불안전한 상태로 남겨진다.
그래서 안전하게 종료하는 방법을 알아보려한다.
1. stop플래그를 이용하는 방법
run()메소드가 정상적으로 종료되도록 유도한다.
public class XXXThread extends Thread{
private boolean stop; //stop 플래그 필드
public void run(){
while(!stop){ //stop이 true가 되면 run()이 종료
스레드가 반복 실행하는 코드;
}
//스레드가 사용한 자원 정리
// 자원: 파일, 네트워크 연결 등등
}
}
stop 필드가 false인 경우, while문이 조건식이 true가 되어 반복 실행
stop 필드가 true인 경우, while문의 조건식이 false가 되어 while문을 빠져나오고, run()메소드가 끝나게 되어 스레드가 안전하게 종료된다.
예시2) 1초 후 출력 스레드를 중지
public class StopFlagEx {
public static void main(String[] args) {
PrintThread1 printThread = new PrintThread1();
printThread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
// 스레드를 종료하기 위해 stop 필드를 true로 변경
printThread.setStop(true);
}
}
무한 반복해서 출력하는 스레드
public class PrintThread1 extends Thread {
private boolean stop;
public void setStop(boolean stop) {
this.stop = stop;
}
public void run() {
while (!stop) {
System.out.println("실행 중");
}
System.out.println("자원 정리"); //stop이 true가 될때 멈춤
System.out.println("실행 종료");
}
}
나머지는 다음에, (아래는 다음 글)
※용어 정리
-
스레드 상태: 스레드를 생성하고 시작하면 스레드는 다양한 상태를 갖는다. 스레드는 자동으로 혹은 코드에 의해서 변경 될 수 있다.
-
일시 정지: 실행 중인 스레드를 일정 시간 동안 멈추게 하려면 sleep() 사용하면 된다. Thread.sleep() 메소드는 일정시간동안 멈추고 그 후 다시 실행 대기 상태로 돌아간다.
-
안전한 종료: Thread는 스레드를 즉시 종료하기 위해 stop()메소드를 제공하나, 사용 중이던 자원들이 불안전하게 종료되어 사용하지 않는다. 안전하게 종료하기 위해 stop 플레그 또는 interrupt()메소드를 이용한다.
-
데몬 스레드: 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드 이다. 주 스레드가 종료되면 데몬 스레드는 강제적으로 종료 된다.
본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.
'Work & Study > JAVA (& 혼공자Java)' 카테고리의 다른 글
자바(Java) - 컬렉션 프레임워크 (List 컬렉션 1) (1) | 2021.01.12 |
---|---|
자바(Java) - 스레드 제어2 (0) | 2021.01.07 |
자바(Java) - 스레드5 (동기화 메소드) (0) | 2020.12.30 |
자바(Java) - 스레드4 (스레드 이름) (0) | 2020.12.21 |
자바(Java) - 스레드3 (toolkit.beep(); 비프음 실행) (0) | 2020.12.21 |