반응형
프로젝트를 진행하다보면 Daemon Thread를 사용해야 할 경우가 있다.
본인은 서버가 시작될떄 background로 떠있는 daemon이 필요하여, Daemon Thread를 사용하였다.
자 그럼 Daemon Thread란? 무엇인가.
자바에서 스레드는 각자의 작업이 끝날때까지 계속해서 작업을 하게 되어 있다.
Daemon Thread는 main Thread가 종료될때 같이 종료가 되는 점을 이용한 자식 Thread라고 보면된다.
Daemon Thread
: 주 스레드의 작업을 돕는 보조적인 역할을 수행
: 주 스레드가 종료되면 데몬 스레드는 강제적으로 자동종료
=> 워드 프로세서의 자동저장, 미디어 플레이어의 동영상 및 음악재생 등
Daemon Thread 설정 방법
사용법은 간단하다. Thread를 사용할때 Thread생성 후 setDaemon(true)만 지정해주면 끝이난다.
:주 스레드가 데몬이 될 스레드의 setDaemon(true)를 start() 메소드 호출전에 호출
=> 그렇지 않으면 illegalThreadStateException 발생한다.
public class PushDaemonWebAppListener implements ServletContextListener, Runnable{
private Thread thread;
private boolean isShutdown = false;
public void startDaemon() {
if (thread == null) {
thread = new Thread(this, "Daemon thread for background task");
thread.setDaemon(true);
}
if (!thread.isAlive()) {
thread.start();
}
}
//Thread
public void run() {
Thread currentThread = Thread.currentThread();
System.out.println("@@@ Name : " + Thread.currentThread().getName() + "@@@");
//로직
while(!this.isShutdown){
try{
System.out.println("alive");
Thread.sleep(1000);
//10초마다 살아있다 알려주기
}catch(Exception e){
e.printStackTrace();
}
}
}
public void contextInitialized (ServletContextEvent event) {
System.out.println ("@@ DaemonListener.contextInitialized. @@");
//Daemon Thread 시작
startDaemon();
}
//서버 사망시 커넥션 연결을 다 풀어준다.
public void contextDestroyed (ServletContextEvent event) {
System.out.println ("@@ DaemonListener.contextDestroyed. @@");
this.isShutdown = true;
try{
//스레드종료 한 뒤 다음을 실행시키도록 join.
thread.join();
thread = null;
}
catch (InterruptedException ie)
{
ie.printStackTrace();
}
}
추가내용 작성 예정입니다~
반응형
'Java > Basic' 카테고리의 다른 글
[Java-Basic] Reflection API 편리하게 사용하여 Vert.x Verticle 사용하기 (0) | 2021.04.23 |
---|---|
[Java/Basic] Queue란 ? Stack이란? 사용법 및 기본개념 (0) | 2021.04.13 |
[Java/Basic] Thread run과 start의 차이 (0) | 2021.04.12 |
[Java] Builder Pattern이란? 객체 생성 방법들 (0) | 2021.03.19 |
[Java-Basic] 재귀함수를 통해 팩토리얼 연습 (0) | 2021.02.15 |