Java 线程池
- 一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接 new 一个线程来运行,而线程的创建和销毁是需要开销的。线程池里面的线程是可复用的,不需要每次执行异步任务时都重新创建和销毁线程
- 二是线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等
线程池的参数解析
参数名 | 描述 |
---|---|
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);
}
}