기본적으로 스레드를 활용하고 관리하기 위해 필요한 개념들을 공부하여 정리한 글이다.
데몬스레드는 우선순위가 낮아 보이지 않는 곳에서 실행되는 스레드를 의미하는데, 1차적으로 메인스레드 실행 완료 후 필요 시 데몬스레드가 실행된다.
JVM 및 애플리케이션 종료는 메인스레드의 종료 시점에 따라 달라지는데, 데몬스레드는 이와 상관없으며 역으로 애플리케이션 측에서 강제종료 할 수 있다.
우선순위가 낮다는 의미는 다음과 같은 현상을 수반한다.
Runnable daemon = () -> {
for(int i = 0 ; i < 10000 ; i++){
System.out.println("daemon! " + i);
}
};
Thread thread = new Thread(daemon);
thread.setDaemon(true);
thread.start();
for(int i = 0 ; i < 100 ; i++){
System.out.println("task! " + i);
}
}
메인스레드, 높은 우선순위를 가진 스레드이며 JVM은 메인스레드(사용자스레드) 작업 종료 시 데몬스레드를 강제로 종료한다.
멀티스레드 환경에서 스레드의 작업 중요도에 따라 스레드 우선순위를 부여할 수 있다.
스레드 중요도가 높을 수록 그만큼 더 많은 작업시간과 자원을 할당받은 상태로 처리를 진행할 수 있으며, JVM 혹은 사용자 직접 지정을 통해 설정할 수 있다.
보통 우선순위는 최대/최소/보통 우선순위로 나타낼 수 있다(높을수록 우선순위가 높다).
스레드의 우선순위는 setPriorty() 메서드를 통해 지정할 수 있고, getPriorty()를 통해 확인할 수 있다.
스레드의 우선순위가 높다고하여 빨리 종료되는 것은 아니지만, 할당 자원이나 처리 시간을 더 많이 가져가므로 그럴 가능성이 높다고 할 수 있겠다.
스레드 그룹은 스레드를 관리하는 상위 관리 체계의 개념이며, 최초 실행 시 JVM은 system 스레드 그룹을 생성하여 메인스레드를 생성 및 처리 시작한다.
모든 스레드는 반드시 하나의 스레드 그룹에 포함되어야 하며, 스레드 그룹을 지정하지 않는다면 자동으로 main 스레드에 종속된다.
보통 스레드를 일시정지한다는 것은 스레드그룹에서 스레드에게 interrupt를 발생시키는 개념으로, 스레드그룹에서 스레드를 통제하는 것을 의미한다.