概要
在日常开发中,肯定避免不了使用多线程。线程池是创建执行线程非常推荐的方式。至于为啥,我就引用《Java并发编程艺术》中的话。
- 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控
线程池创建的两种方式
ThreadPoolExecutor的方式
解释:new ThreadPoolExecutor()方式是阿里推荐创建线程池的方式,具体原因我们后面会利用源码会进一步讲解。还
有一种方式就是利用Executors去创建线程池,底层还ThreadPoolExecutord的方式,所以先讲解ThreadPoolExecutor.....
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(
10,20,1000,TimeUnit.MILLISECONDS,new LinkedBlockingDeque<>()
);
for (int i = 1; i <= 10 ; i++) {
Thread t = new Thread(()->{
String name = Thread.currentThread().getName();
System.out.println(name+":Running.....");
},"t"+i);
threadPoolExecutor.execute(t);
}
threadPoolExecutor.shutdown();
}
运行结果 如下: pool-1-thread-1:Running.....
pool-1-thread-2:Running.....
pool-1-thread-4:Running.....
pool-1-thread-3:Running.....
pool-1-thread-5:Running.....
pool-1-thread-6:Running.....
pool-1-thread-7:Running.....
pool-1-thread-8:Running.....
pool-1-thread-9:Running.....
pool-1-thread-10:Running.....
目前线程已经成功的启动了,但是脑袋还可能是一头雾水,那些ThreadPoolExecutor中的参数到底是啥玩意啊?其实这才是重点。
ThreadPoolExecutor构造函数
由于ThreadPoolExecutor的构造函数有很多,由于篇幅原因,就不用多copy了,我把最主要的贴在下面,
其他的构造方 法也是调用如下..
/**
* Creates a new {@code ThreadPoolExecutor} with the given initial
* parameters.
*
* @param corePoolSize 核心线程数,也就是线程池中运行线程数的最大值
* @param maximumPoolSize 线程池最大的容量
* @param keepAliveTime 当线程数大于核心时,这是多余的空闲线程在终止之前等待新任务的最长时间。
* @param unit 时间的单位是啥
* @param workQueue 保留任务的队列
* @param threadFactory 执行者使用的工厂
* @param handler 达到了线程界限和队列容量就会执行被阻塞时的拒绝策略
* @throws IllegalArgumentException if one of the following holds:<br>
* {@code corePoolSize < 0}<br>
* {@code keepAliveTime < 0}<br>
* {@code maximumPoolSize <= 0}<br>
* {@code maximumPoolSize < corePoolSize}
* @throws NullPointerException if {@code workQueue}
* or {@code threadFactory} or {@code handler} is null
*/
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 || //进行参数的验证
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
//赋值默认值