반응형

데몬 쓰레드 (demon thread)

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

 

데몬 쓰레드는, 일반  쓰레드의 작업을 돕는 보조적인 역할을 수행한다.

쓰레드의  종류는 2가지 인데,
일반 쓰레드와 데몬 쓰레드가 있다.

데몬 쓰레드가 아닌 것을 일반 쓰레드라고 보면 된다.

데몬쓰레드는 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행하는 것이기 때문에,
일반 쓰레드가 다 종료되고나면 데몬쓰레드가 보조역할을 해줄 쓰레드가 없는 것이다.
그래서 데몬쓰레드는 일반쓰레드가 모두 종료되면 자동적으로 종료된다.

그래서 데몬 쓰레드는 어떤일을 할 때 만드냐면,
가비지 컬렉터, 자동저장, 화면 자동갱신 등 보조작업에 해당되는 쓰레드를 만들때 데몬 쓰레드로 만든다.

데몬 쓰레드는 이런식으로 작성을 하는데, 일반쓰레드가 언제 작업을 마칠지 모르니까, 무한루프로 작성을한다.
무한루프로 작성해도, 일반 쓰레드가 종료되었을 때, 자동종료된다.

데몬 쓰레드를 작성하는 패턴은 위의 예시처럼 결정이 되어있다.
무한루프를 사용하고, if문 사용해서 특정 조건을 만족시킬 때 수행하도록 하면 된다.
무한루프기때문에 계속 실행하면 안되니까 중간에 .sleep으로 쉬는 시간을 준다.

쓰레드를 데몬 쓰레드로 만드는 것은 방금 전에 봤던 것처럼 매우 쉽다.
while이나 for문으로 무한 반복문을 만들고, .sleep으로 주기적으로 if문으로 특정 작업을 수행하도록 설정하면 된다.

쓰레드를 생성한다음, setDaemon(boolean on) 으로 on값을 true로 설정하면 그 쓰레드는 데몬쓰레드가 된다.
그리고 isDamon()은 쓰레드가 데몬 쓰레드인지 확인해준다. 데몬쓰레드이면 true를 반환한다.

setDaemon(boolean on) 메서드는 반드시 start()를 호출하기 전에 실행되어야 한다.
그렇지 않으면 IllegalThreadStateException이 발생한다.
쓰레드를 생성해서 실행한 다음에는(start()가 호출된 다음에는) 이 쓰레드를 데몬쓰레드로 또는 일반쓰레드로 바꿀 수 없다.
그래서 반드시, 쓰레드를 데몬 쓰레드로 하려면 start()호출하기전에 setDaemon(boolean on) 메서드를 실행해야 한다.

[Ex13_7]

 


 

쓰레드의 상태

쓰레드는 이처럼 5가지 상태가 있다.

처음에 쓰레드를 생성만 한상태가 있다.

그다음에 start()를 호출하면 RUNNABLE상태(실행or실행대기)가 된다.
이때, 먼저온 쓰레드들이 앞에 있을 수 있기 때문에 줄을 서야한다. 그러다가 자기차례가되면 특정시간동안 실행하게 된다.
그러다가 자기에게 주어진 시간이 다 되면, 다시 뒤로가서 줄을 슨다. 작업을 다 마칠때까지 이것을 반복한다.

그러다가 stop()이라는 메서드가 호출되던가, 혹은 내가 해야할 작업이 다 끝나면,
쓰레드가 소멸된다.(TERMINATED)라고 한다.

이것이 가장 기본 프로세스고,

쓰레드가 작업을 하다가 중간중간에 멈출때가 있다. suspend()는 일시정지, sleep()은 잠자기, wait()는 기다리기, join()은 다른쓰레드기다리기, I/O block은 입출력대기 등의 상태가 되면 쓰레드가 일시정지상태가 된다.

그리고 5초간 sleep()을 했을때 5초가 지나면 time-out 이되고, 다시 줄을스게 된다.
suspend()의 반대로 resume()재개라는 것이 있다. 일시정지 상태를 푸는 것이다.
wait()의 반대로 notify() 가 있다.
interrupt()는 자는 것을 깨우는 것이다. 원래 5초를 자기로했는데, interrupt()메서드를 호출하면 자던것을 바로 깨운다.

 


 

쓰레드의 실행제어

  • 쓰레드의 실행을 제어할 수 있는 메서드가 제공된다.
    이 들을 활용해서 보다 효율적인 프로그램을 작성할 수 있다.

이러한 메서드를 적절히 활용해서 보다 효율적인 멀티 쓰레드 프로그램이 되도록 작성해야 한다.

static붙은 메서드는 쓰레드 자기자신에게만 호출이 가능하다.

반응형

'JAVA' 카테고리의 다른 글

suspend(), resume(), stop()  (0) 2022.07.07
sleep(), iterrupt()  (0) 2022.07.01
쓰레드의 우선순위, 쓰레드 그룹  (0) 2022.06.12
싱글 쓰레드와 멀티 쓰레드, 쓰레드의 I/O 블락킹  (0) 2022.06.11
쓰레드의 구현과 실행  (0) 2022.05.30