- 일반 쓰레드(non-daemon thread)의 작업을 돕는 보조적인 역할을 수행
- 일반 쓰레드가 모두 종료되면 자동적으로 종료된다.
- 가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용된다.
- 무한루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.
- setDaemon(boolean on)은 반드시 start()를 호출하기 전에 실행되어야 한다. 그렇지 않으면 illegalThreadStateException이 발생한다.
- 실행중 또는 실행대기 상태 모두 RUNNABLE이다.
- 생성 -> 실행대기 -> 실행 -> 실행대기 -> 실행 반복 -> stop()메서드가 호출되면 소멸된다.
- 일시정지 = WAITING, BLOCKING
- suspend() = 일시정지 / sleep() = 잠자기 / wait() / join() = 기다리기 / I/O block = 입출력 대기
- time-out = 시간 종료 / reaume() = 일시정지 상태(suspend) 풀기 / notify = 일시정지 상태(wait) 풀기 / interrupt() = 잠자기(sleep)를 깨운다.
- 쓰레드의 실행을 제어할 수 있는 메서드가 제공된다.
- sleep() : 지정된 시간동안 쓰레드 일시정지 / 지정시간 끝나면 다시 실행대기상태
- join() : 다른 쓰레드 기다리기
- interrupt() : sleep() 또는 join() 상태에서 깨우는 것
- stop() : 쓰레드 종료
- suspend() : 쓰레드 일시정지
- resume() : 일시정지 재개
- yield() : 다른 쓰레드에게 주어진 시간을 양보
- sleep()과 yield()만 static메서드가 붙고 이 둘은 쓰레드 자기 자신에게만 호출 가능하다.
- 다른 실행제어 메서드는 다른 쓰레드에게 호출 가능하다.
- 현재 쓰레드를 지정된 시간동안 멈추게 한다.
static void sleep(long millis) // 천분의 일초 단위 static void sleep(long millis, int nanos) // 천분의 일초 + 나노초
- 예외처리를 해야한다.(InterruptedException이 발생하면 깨어남)
try { Thread.sleep(1, 500000); // 쓰레드를 0.015초 동안 멈추게 한다. } catch(InterruptedException e) {} // InterruptedException은 Exception의 자손. 필수 예외처리
- sleep 상태의 쓰레드는 time-up(시간종료) 또는 interrupted(깨우기)로 깨워야 한다.
void delay(long millis) { try { Thread.sleep(millis); } catch(InterruptedException e) {} }
- 특정 쓰레드를 지정해서 멈추게 하는 것은 불가능하다.
try { try { th1.sleep(2000); -> Thread.sleep(2000); } catch(InterruptedException e) {} } cathc(InterruptedException e) {}
- thread1을 sleep시키는 것이 아닌데 오해(에러는 안나는)를 할 수 있으므로 오른쪽과 같이 클래스이름을 써줘야 한다.
- 대기상태(WAITING)인 쓰레드를 실행대기 상태(RUNNABLE)로 만든다.
void interrupt() 쓰레드의 interrupted상태를 false에서 true로 변경. boolean isInterrupted() 쓰레드의 interrupted상태를 반환. static boolean interrupted() 현재 쓰레드의 interrupted상태를 알려주고, false로 초기화
- Thread 클래스 안에 interrupted상태를 알려주는 변수를 생성하고 interrupted가 되면 false값이 true로 바뀐다.
- isinterrupted를 호출하면 interrupted의 값을 반환한다.
- interrupted는 값을 true에서 false로 바꾼다. (그래야 누가 또 interrupt)를 호출했을 때 알 수 있으므로 초기화 해준다.)
- download가 완전히 끝나거나 취소버튼을 눌렀을 때 download가 종료된다.