서로 관련이 있는 스레드를 하나의 그룹으로 묶어 다루기 위한 장치
- 트리 형태로 연결된다.
```java
public class Application {
public static void main(String[] args) {
Thread thread1 = new Thread(new ThreadImplementsInterface());
thread1.start();
System.out.prinn(thread1.getThreadGroup()); // java.lang.ThreadGroup[name=main,maxpri=10]
ThreadGroup group = new ThreadGroup("myThreads");
group.setMaxPriority(7);
Thread thread2 = new Thread(group, new ThreadImplementsInterface()); // 그룹 지정
thread2.start();
System.out.prinn(thread2.getThreadGroup()); // java.lang.ThreadGroup[name=myThreads,maxpri=7]
}
}
```
주 스레드의 작업을 돕는 보조 스레드
- 사용자가 직접 제어하지 않고 백그라운드에서 돌아가면서 작업하는 프로그램
- 일반 스레드(Normal Thread)가 모두 종료되면 데몬 스레드도 더는 할 일이 없으므로 자동 종료
- 일반 스레드와 생성, 실행 방법은 같다.
- 주 스레드가 데몬이 될 스레드를 실행시키기 전에
setDaemon(true)
로 데몬 설정
```java
Thread thread = new Thread(new ThreadImplementsInterface());
thread.setDaemon(true);
thread.start();
```
프로그래머가 동적으로 할당한 메모리 중 더 이상 사용하지 않은 영역을 자동으로 찾아내어 해제해주는 데몬 스레드
- 자동 메모리 관리
- 메모리 관련 버그 발생 확률이 낮아짐
- 가비지 컬렉터가 동작하는 동안 프로세서가 일시적으로 중지되어 성능 저하가 발생한다.
작업 처리에 사용되는 스레드를 제한된 개수만큼 정해놓고 작업 큐에 들어오는 작업들을 하나씩 스레드가 맡아 처리하는 것
- 스레드 제어 문제 해결 방법
- JVM 옵션 제어가 아닌 어플리케이션이 선택적으로 사용
- Tomcat 같은 웹서버에서 사용
- 동시에 수천~수만개의 요청
ExecutorService
, Executors
사용corePoolSize
코어 스레드 수maximumPoolSize
최대 스레드 수maximumPoolSize
만큼 커질 수 있다.keepAliveTime
유지 시간corePoolSize
보다 많으면서 해당 파라미터값보다 오래 하는 일이 없으면 제거된다.ExecutorService service = Executors.newFixedThreadPool(int nThreads)
ExecutorService service = Executors.newCachedThreadPool()
ExecutorService service = Executors.newScheduledThreadPool(int corePoolSize)
excutorService.shutdown()
executorService.shutdownNow()
executorService.awaitTermination(long timeout, TimeUnit unit)
스레드풀에 작업 요청을 하는 방식
execute()
submit()
Future<?>
로 처리 결과 반환