English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

java ThreadPoolExecutor 사용 방법 간단 소개

java ThreadPoolExecutor

서론:

프로젝트에서 문자 메시지 전송과 같은 기능을 사용하는 경우, 일반적으로 문자 메시지 전송을 비동기 작업으로 변환합니다. 대부분의 경우, 문자 메시지가 성공적으로 전송되었는지 실패했는지는 메인 프로세스에 영향을 미치지 않습니다. 물론 MQ 메시지 전송과 같은 작업도 비동기 작업으로 포장할 수 있습니다.

기본적인 New Thread

비동기 작업이 되고 싶다면, 직접 new thread를 생성하고 run 메서드에서 비즈니스 로직을 구현할 수 있습니다. 예를 들어:

 new Thread(new Runnable() {
    public void run() {
      //문자 메시지 전송, MQ 메시지 전송 등
    {}
 });

하지만 이 방식에는 몇 가지 단점이 있습니다.

1. 매번 새로운 스레드를 생성하고 실행 후 소멸시키며 재사용할 수 없습니다;

2. 시스템의 동기화 양이 매우 크고 많은线程가 필요한 경우, 이렇게 매번 new를 사용하는 방식은 자원을 싸게 사용할 수 있습니다.

ThreadPoolExecutor

JDK를 사용하여1.5의 ThreadPoolExecutor를 사용하여 비동기 작업을 포장할 수 있습니다. ThreadPoolExecutor의 장점은线程 재사용이 가능하며, 더 많은 작업을 수행하기 위해 최소한의线程를 사용할 수 있다는 점입니다. 성능과 효율성이 매우 뛰어납니다. 예제 코드는 다음과 같습니다:

public class ThreadPool {
  private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(8, 12, 30,
      TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50000), new ThreadPoolExecutor.AbortPolicy());
  public static ThreadPoolExecutor getThreadPool() {
    return threadPool;
  {}
{}

파라미터 설명

public ThreadPoolExecutor(int corePoolSize,
               int maximumPoolSize,
               long keepAliveTime,
               TimeUnit unit,
               BlockingQueue<Runnable> workQueue,
               RejectedExecutionHandler handler) {
 {}

corePoolSize: workQueue의 요소가 최대 값에 도달하기 전까지, corePoolSize는 풀의 thread 수의 최대 값을 의미합니다;
maximumPoolSize: 풀에서 허용할 수 있는 최대 thread 수;
keepAliveTime: 현재 풀의 thread 수가 corePoolSize를 초과하면, 초과된 thread이 너무 오랫동안 비활성 상태가 되면, 이러한 thread은 파괴되어야 합니다. keepAliveTime은 이러한 thread의 최대 비활성 시간을 의미합니다;
unit: keepAliveTime의 시간 단위;
workQueue: 풀의 thread 수가 corePoolSize에 도달했을 때, 추가적인 요청이 오면 해당 task을 큐에 넣습니다;
handler: workQueue가 가득 찬 상태에서, 풀의 thread 수가 maximumPoolSize에 도달했을 때, 추가적인 자원이 요청 처리에 사용할 수 없습니다. RejectedExecutionHandler를 통해 거부 처리나 작업 제거 등을 수행해야 합니다.

실행 과정

요청이 없을 때,线程 풀에는 어떤线程도 없습니다;

요청이 있을 때,线程을 생성하고, 풀의线程 수가 corePoolSize와 같아질 때까지 계속 생성합니다;

요청이 많아 더 많은线程가 필요할 때, ThreadPoolExecutor는 요청을 큐에 넣고 새로운线程을 생성하지 않습니다;

workQueue도 가득 찬 경우, ThreadPoolExecutor는 threadCount가 maximumPoolSize와 같아질 때까지线程을 계속 생성합니다;

threadCount가 maximumPoolSize에 도달했고, workQueue도 느려졌을 때, 요청을 RejectedExecutionHandler에 처리할 수밖에 없습니다.

비고

ThreadPoolExecutor를 사용할 때, 자신의 비즈니스 상황에 따라 적절한 파라미터 값을 지정해야 합니다.

읽어주셔서 감사합니다. 많은 도움이 되길 바랍니다. 감사합니다. 이 사이트에 대한 지원에 감사합니다!