Skip to content

Java 线程池

  1. 一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接 new 一个线程来运行,而线程的创建和销毁是需要开销的。线程池里面的线程是可复用的,不需要每次执行异步任务时都重新创建和销毁线程
  2. 二是线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等

线程池的参数解析

参数名描述
corePoolSize核心线程池的大小,如果核心线程池有空闲,新增任务就会呗核心线程池新建一个线程执行,执行完不会销毁线程,线程会进入缓存队列等待再次呗运行
maximumPoolSize线程池能创建最大的线程数量,如果核心线程池和缓存队列都满了,新的任务进来就会创建新的线程来执行,数量不会超过 maximumPoolSize,一般建议设置跟 corePoolSize 一样
keepAliveTime非核心线程能够空闲的最长时间,超过时间,线程终止。这个参数默认只有在线程数量超过核心线程池大小时才会起作用。只要线程数量不超过核心线程大小,就不会起作用
unit时间单位,和 keepAliveTime 配合使用
workQueue缓存队列,用来存放等待被执行的任务
threadFactory线程工程,用来创建线程
handler拒绝策略

使用案例


@Slf4j
public class UploadThreadPool {


    private static final int THREAD_SIZE = 5;

    private static final int QUEUE_SIZE = 100000;

    private static ExecutorService executor = new ThreadPoolExecutor(
            THREAD_SIZE,
            THREAD_SIZE,
            60L,
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(QUEUE_SIZE),
            new ThreadFactory() {
                @Override
                public Thread newThread(Runnable r) {
                    Thread thread = new Thread(r);
                    thread.setName("archive-upload-thread");
                    return thread;
                }
            },
            new ThreadPoolExecutor.AbortPolicy()
    );


    public static void submit(Runnable task) {
        executor.execute(task);
    }
}

Released under the MIT License.