JAVA3_04_데몬 쓰레드, 쓰레드 흐름

charl hi·2021년 9월 29일
0

JAVA3

목록 보기
4/9
post-thumbnail

링크텍스트

데몬 쓰레드 daemon thread

  • 일반 쓰레드(non-daemon thread)의 작업을 돕는 보조적인 역할을 수행
  • 일반 쓰레드가 모두 종료되면 자동적으로 종료된다.
  • 가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용된다.
  • ✨무한루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.

데몬쓰레드로 작성

public void run() {
	while(true) {
		try {
			Thread.sleap(3 * 1000);	//3초마다 휴식(계속 실행할 수 없으니)
		} catch(InterruptedException e) {}
		//autoSave의 값이 true면 autoSave()를 호출한다.
		if(autoSave) {
			autoSave();
		}
	}
}

데몬/일반 쓰레드로 변경

  1. boolean isDaemon()
  • 쓰레드가 데몬쓰레드인지 확인한다.
  • 데몬쓰레드이면 true로 반환한다.
  1. void setDeamon(boolean on)
  • 쓰레드를 데몬쓰레드 또는 일반쓰레드로 변경한다.

  • ✨✨반드시 start()를 호출하기 전에 실행되어야 한다.
    -> 그렇지 않으면 IllegalThreadStateException 발생

  • ✨✨setDaemon(boolean) ---> start()



ex13_07


class Ex13_07 implements Runnable {
	static boolean autoSave = false;

	public static void main(String[] args) {
		Thread t = new Thread(new Ex13_07());	//Thread(Runnable r)
		
		t.setDaemon(true);	//이 부분이 없으면 종료되지 않는다.
		t.start();
		
		for(int i=1; i<=20; i++) {
			try {
				Thread.sleep(1000);	//1초 휴식
			} catch (InterruptedException e) {}
			//1초 지나면 아래 수행, 즉 1초마다 i 출력
			System.out.println(i);
			//5초 되면 autoSave=true로 돼 autoSave()바로 수행!
			//***그 뒤로는 3초 마다 수행!!!
			if(i==5) autoSave = true;
		}
		
		System.out.println("프로그램을 종료합니다.");
	}
	
	public void run() {
		while(true) {	//무한루프지만 일반쓰레드가 종료되면 데몬쓰레드는 자동종료이므로 괜찮음
			try {
				Thread.sleep(3 * 1000);	//3초 휴식
			} catch (InterruptedException e) {}
			//3초 지나면 아래 수행
			//autoSave의 값이 true면 autoSave()호출
			if(autoSave) autoSave();
		}
	}
	
	public void autoSave() {
		System.out.println("작업파일이 자동저장되었습니다.");
	}

}

1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
11
작업파일이 자동저장되었습니다.
12
13
14
작업파일이 자동저장되었습니다.
15
16
17
작업파일이 자동저장되었습니다.
18
19
20
프로그램을 종료합니다.


만약 데몬쓰레드로 하지 않는다면??
-> 무한루프로 계속 실행됨

t.setDaemon(true); 를 없애면 ..


1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
11
작업파일이 자동저장되었습니다.
12
13
14
작업파일이 자동저장되었습니다.
15
16
17
작업파일이 자동저장되었습니다.
18
19
20
프로그램을 종료합니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
...


쓰레드의 상태

  • 쓰레드 생성 -> start()로 쓰레드 호출 -> 쓰레드들 줄서기 -> 자기 차례가 되면 실행하고 끝나면 다시 줄서기 반복 -> 작업이 다 끝나거나 stop()으로 인해 멈춰서 소멸

  • 중간에 suspend(), sleep(), wait(), join(), I/O block 등으로 인해 일시정지된다.(쉼터, 대기실)

  • time-out, resume(), notify(), interrupt() 등으로 인해 다시 줄서기



쓰레드의 실행제어

  • 쓰레드의 실행을 제어할 수 있는 메소드가 제공된다.

  • ✨✨static sleep(long), static yield() : 다른 쓰레드에게 적용될 수 없고, 쓰레드 자기 자신에게만 호출 가능



Ref

0개의 댓글

관련 채용 정보