一、创建一个线程池
corePoolSize:核心线程数——最小空闲线程数(这很重要)
maximumPoolSize:最大线程数——核心线程+非核心线程数了
keepAliveTime:空闲线程等待新线程加入间隔时间
unit:空闲线程等待新线程加入间隔时间单位
workQueue:等待执行的线程队列
threadFactory:用于创建新线程的工厂类,可以用于自定义线程名称
handler:用于执行拒绝策略
二、线程池的基本使用
2.1示例代码
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
public class Main {
public static void main(String[]args) {
/**
* 业务需求
* 你在网上同时约了20个女神奔现
* 你忙不过来找了一个兄弟陪你一起
* 约了2个贵宾室2个普通包间(只能在贵宾室或包间内聊天)
* 酒店的大厅有8个座位
* 打算每个女神聊三秒(真男人系列)
* 请开始你的表演
*/
Executor executor = new ThreadPoolExecutor(2, 4, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(8), new ThreadFactory() {
AtomicInteger chatNum = new AtomicInteger(0);
@Override
public ThreadnewThread(Runnable r) {
return new Thread(r, "聊天室" + chatNum.getAndIncrement());
}
}, new RejectedExecutionHandler(){
@Override
public void rejectedExecution(Runnabler, ThreadPoolExecutor executor) {
System.out.println("女神,不好意思,贵宾室和包间都挤满了!!!");
}
});
for (int i = 0; i < 20; i++) {
executor.execute(() -> {
try {
System.out.println("我在" + Thread.currentThread().getName() + "和女神聊3秒钟的天");
Thread.sleep(3000);
} catch(InterruptedException e) {
throw new RuntimeException(e);
}
});
}
}
}
2.2执行结果
2.3执行过程分析图
三、其余四种线程池(不推荐使用)
3.1FixedThreadPool
FixedThreadPool顾名思义即是固定数量的线程池,他的核心线程与非核心线程数量都由使用者指定且相等,即最小空闲线程随时都是nThreads
其空闲线程等待执行时间为0,因为没有非核心线程,所以不需要等待
队列使用了LinkedBlockingQueue并且没有指定队列大小,所以默认等待队列大小为Integer.MAX_VALUE
3.2SingleThreadPool
注意看他与FixedThreadPool其实没有太大的区别,相当于默认nThreads设置为了1,所以两者放在一起讲解
3.3CachedThreadPool
缓存线程池,使用SynchronousQueue作为缓存队列,即不接受缓存,同时非核心线程为Integer.MAX_VALUE,所以线程会立即得到执行,小心线程爆炸
3.4ScheduledThreadPoolExecutor
用于执行定时任务的线程池,通过DelayedWorkQueue实现定时任务的获取和控制
3.5不推荐原因
几种线程池未指定等待队列的容量,并发量高时容易发生内存占用过高或溢出,后续会对几种队列进行描述