스레드(thread) - (3)

13090 단어 JavaJava

데몬(Daemon) 스레드

주 스레드의 작업에 보조적인 역할을 하는 스레드를 말한다. 종속적이기 때문에 주 스레드가 종료되면 데몬 스레드도 자동 종료된다.
ex) 네이버 메일 작성시 자동 저장 기능

설정 방법

주 스레드에서 데몬 스레드가 될 스레드의 setDaemon(true)를 호출한다. start 호출하기 이전에 호출해야 한다.

public static void main(String[] args){
    AutoSaveThread thread = AutoSaveThread();
    thread.setDaemon(true);
    thread.start();
    // ...
}

스레드 그룹(Thread Group)

말그대로 여러 스레드를 모아놓은 그룹이다. 서로 연관된 스레드를 묶어서 관리할 목적으로 사용하며, 스레드 그룹은 계층적으로 하위 스레드 그룹을 가질 수가 있다.

자동 생성되는 그룹

system 그룹

JVM 운영에 필요한 스레드들을 포함하는 그룹이다.

system/main 그룹

메인 스레드를 포함하는 스레드이다.

스레드는 반드시 하나의 스레드 그룹에 포함되는데, 기본적으로 자신을 생성한 스레드와 같은 스레드 그룹에 속하게 된다. 개발자가 스레드 생성 시 별도로 특정 스레드 그룹에 포함시키지 않으면 기본적으로 system/main에 속하게 된다.

스레드 그룹 생성

ThreadGroup 클래스를 이용하여 생성한다.

// 생성자 목록
ThreadGroup(String name)
ThreadGroup(ThreadGroup parent, String name)
ThreadGroup(ThreadGroup parent, Runnable target, String name);
// 그룹을 생성하면서 스레드를 그룹에 포함
ThreadGroup(ThreadGroup parent, Runnable target, String name, long stackSize);

스레드 그룹 이름

ThreadGroup gruop = Thread.currentThread.getThreadGroup();
String groupName = group.getName();

스레드 그룹 일괄 interrupt

스레드 그룹에서 interrupt()를 호출하면 소속된 모든 스레드에 interrupt 메서드가 호출된다.

public static void main(String[] args) {
    ThreadGroup mainGroup1 = Thread.currentThread().getThreadGroup();
    String threadGruop1 = mainGroup1.getName();

    System.out.println(threadGruop1);

    ThreadGroup myGroup = new ThreadGroup("myGroup");

    WorkThread workThreadA = new WorkThread(myGroup, "workThreadA");
    WorkThread workThreadB = new WorkThread(myGroup, "workThreadB");

    workThreadA.start();
    workThreadB.start();

    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {}

    myGroup.interrupt();
    // workThreadA, workThread B 종료됨
}

메서드

스레드 풀(Thread Pool)

스레드 폭증

병렬 작업 처리가 많아지면 스레드 개수가 증가하여, 스레드 생성과 스케줄링으로 인해 CPU가 바빠지고, 메모리 사용량이 늘어난다. 따라서 어플리케이션의 성능이 급격히 저하된다.

스레드 풀 동작 원리

스레드 풀은 작업 처리에 사용되는 스레드를 제한된 개수만큼 미리 생성한다. 처리할 작업들이 작업 큐에 들어오면 각 스레드가 각각의 작업을 맡아서 처리한다. 처리 후에는 작업 결과를 어플리케이션으로 전달하고, 다시 작업 큐에서 새로운 작업을 가져와 처리한다. 작업 요청이 계속 들어온다 하더라도 작업 큐에 있는 작업의 양만 늘고, 스레드의 수가 늘지는 않는다.

ExecutorService 인터페이스, Executors 클래스

둘 다 java.util.concurrent 패키지에서 제공한다. Executors의 static 메서드를 이용하여 ExecutorService의 구현 객체를 생성할 수 있다. Java에서는 이 구현 객체가 스레드 풀의 역할을 한다.

스레드 풀 생성 메서드

메서드초기 스레드 수코어 스레드 수최대 스레드 수
newChachedTreadPool()00Integer.MAX_VALUE
newFixedThreadPool(int nThreads)0nThreadsnThreads

초기 스레드 수

스레드 풀 생성시의 스레드 수를 말한다.

코어 스레드 수

스레드 풀에서 최소한 유지하는 스레드 수를 말한다., 스레드 수가 코어 스레드 수보다 많을 경우 오랫동안 사용하지 않는 스레드는 스레드 풀에서 제거된다.

최대 스레드 수

스레드 풀이 최대한 가질 수 있는 스레드 수를 말한다.

newChachedThreadPool

int형의 최댓값만큼 스레드를 추가할 수 있지만, OS 혹은 메모리 상황에 따라 다르다. 스레드가 60초 동안 아무 작업을 하지 않으면 추가된 스레드를 종료하고 풀에서 제거한다.(코어 스레드 수가 0이므로)

ExecutorService executorService = Executors.newChachedThreadPool();

newFixedThreadPool

nThread개의 스레드가 아무 작업도 하지 않더라도 삭제되지 않고 유지된다.

int nThread = Runtime.getRuntime().availableProcessors();
// CPU의 코어 수 반환

ExecutorService executorService = Executors.newFixedThreadPool(nThread);

ThreadPoolExecutor

newChachedThreadPool, newFixedThreadPool 메서드가 동작하여 생성된 ThreadPoolExecutor 객체를 반환한다.

ExecutorService executorService = new ThreadPoolExecutor(
    3,    // 코어 스레드 수
    100   // 최대 스레드 수
    120L,  // 작업하지 않는 스레드를 보존하는 시간
    TimeUnit.SECONDS, // 시간 단위
    new SynchronousQueue<Runnable>() // 작업 큐
);

스레드 풀 종료

스레드 풀의 스레드는 기본적으로 데몬 스레드가 아니기 때문에 스레드 풀을 종료하여 스레드들을 종료시켜야 한다.

좋은 웹페이지 즐겨찾기