728x90
반응형
데몬쓰레드 - Daemon thread
데몬쓰레드란 메인쓰레드 옆에서 보조를 담당하는 쓰레드이다.
- 보조쓰레드이기 때문에 항시 옆에서 동작하다가 메인쓰레드가 종료되면 같이 종료된다.
- 예시로 워드의 자동저장이나 GC가 있다.
데몬쓰레드 선언
아래의 코드처럼 데몬쓰레드를 선언할 때는 아래의 사항을 고려해야한다.
- setDaemon을 사용하여 데몬쓰레드를 생성하고 start전에 실행해줘야 데몬쓰레드로 적용된다.
- 데몬쓰레드는 항시 동작하고 메인쓰레드가 종료되면 동시에 종료되기 때문에 무한반복문으로 생성한다.
아래의 코드 순서:
- 쓰레드를 runnaable로 받아온 후에 Thread 클래스로 할당한다.
- 받은 쓰레드를 setDaemon으로 데몬쓰레드로 정의한 후에 만든 데몬쓰레드를 실행한다.
- 데몬쓰레드가 실행됨가 동시에 메인쓰레드로 이동하여 for문을 반복한다.
- for문이 1초마다 i의 변수를 실행하고 i가 2가 될 때 데몬쓰레드의 변수인 isStock을 true로 변환한다.
- isStock이 true이기 때문에 항시 동작되고 있던 데몬쓰레드의 코드인 purchase()메서드가 조건이 충족된다.
- 충족된 조건을 3초마다 실행하여 화면에 출력하고 메인쓰레드의 for문이 종료되면 동시에 종료된다.
public class DaemonPractice {
public static void main(String[] args) {
Runnable r = new DtHread();
Thread t = new Thread(r);
DtHread d = (DtHread)r;
t.setDaemon(true); //데몬쓰레드는 쓰레드의 실행인 start전에 실행해줘야한다.
t.start();
for(int i = 1; i<10; i++) {
try {
Thread.sleep(1000);
System.out.println(i);
}
catch (InterruptedException e) {
}
if(i == 2) {
d.isStock = true;
}
}
}
}
class DtHread implements Runnable{
boolean isStock = false;
@Override
public void run() {
while(true){ // 무한반복문을 사용해 데몬쓰레드 지정
try {
Thread.sleep(3 * 1000);
} catch (Exception e) {
}
if(isStock) {
purchase();
}
}
}
public void purchase() {
System.out.println("매수 완료");
}
}
쓰레드의 실행과정
쓰레드는 대표적으로 3가지 과정으로 실행된다.
- new - 새롭게 시작됨
- runnable - 실행되기 위하여 기다리는 중
- terminated - 실행 후에 종료
runnable의 과정에 쓰레드의 실행에 관여(방해)하는 메서드들이 존재하는데 그 메서드들은 아래와 같다.
- suspended() - 일시정지
- wait() - 다른 쓰레드가 종료될때까지 기다림
- join() - 다른 쓰레드대신 먼저 실행됨 (본인 것 부터 실행!)
- sleep() - 쓰레드를 잠시 중지
방해과정들을 물리치는? 대비적 메서드는 아래와 같다.
resume() - suspended되어진 쓰레드를 다시 진행
notify() - wait되어진 쓰레드를 다시 동작시킴
interrupt() - join()이나 sleep(),즉 자고있는 쓰레드를 강제 기상시켜 동작시킴
쓰레드 실행제어 메서드
위의 실행과정 메서드를 자세하게 나열해 놓았다.
- yield: 본인의 실행하고 있던 일을 내려놓고 다른 쓰레드에게 작업 시간 양도
아래의 sleep과 yield에만 static이 있다. 즉, sleep과 yield 메서드는 본인의 쓰레드에만 선언이 가능하다는 의미이다.
728x90
반응형
'Java > 자바의정석 기초편' 카테고리의 다른 글
자바의 정석 12장 (32일차) - 스레드 (0) | 2022.02.24 |
---|---|
자바의 정석 12장 (31일차) - 열거형 (enum) (0) | 2022.02.22 |
자바의 정석 12장 (31일차) - 와일드카드 <?> & 지네릭스 형변환 (0) | 2022.02.22 |
자바의 정석 12장 (30일차) - 지네릭스(Generics) & 타입 변수 & 제약 (0) | 2022.02.21 |
자바의 정석 11장 (30일차) - Collections 클래스 (0) | 2022.02.21 |