前言
本篇博客我将会详细地介绍什么是线程池及线程池的各种要点
一.线程池是什么
1.1概念
存放线程的池子,方便后续直接使用线程,而不是频繁地释放,降低开销。
1.2为什么要创建线程池
虽然创建销毁线程比创建销毁进程更轻量,但是频繁地创建销毁线程的时候还是比较低效的。
二.创建线程池的方法
创建线程池主要有两种方式:
1)通过Executors工厂类创建:
创建方式比较简单,但是定制能力比较有限
2)通过ThreadPoolExecutor创建:
创建方式比较复杂,但是定制能力强,LinkedlockingQueue表示线程池的任务队列,用户通过submit / execute向这个任务队列中添加任务,再由线程池中的工作线程来执行任务
三.ExecutorService和Executors
ExecutorService 表示一个线程池实例
Executors是一个工厂类,能够创建出几种不同风格的线程池
ExecutorService的submit方法能够向线程池中提交若干个任务
代码如下:
ExecutorService pool = Exectuors.newFixedThreadPool(10);
pool.submit(new Runnable() {
@Override
public void run(){
System.out.println("hello");
}
});
Executors 创建线程池的几种方式:
四.ThreadPoolExecutor
ThreadPoolExecutor 提供了更多的可选参数,可以进一步细化线程池行为的设定
ThreadPoolExecutor的构造方法
※:理解ThreadPoolExecutor构造方法的参数
把创建一个线程池想象成开一个公司,每一个员工相当于一个线程;
1.AbortPolicy(): 超过负荷, 直接抛出异常.
2.CallerRunsPolicy(): 调⽤者负责处理
3.DiscardOldestPolicy(): 丢弃队列中最⽼的任务.
4.DiscardPolicy(): 丢弃新来的任务
代码示例如下:
ExecutorService pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS,
new SynchronousQueue<Runnable>(),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy)
for(int i=0;i<3;i++) {
pool.submit(new Runnable() {
@Override
void run() {
System.out.println("hello");
}
});
}
五.线程池工作流程
线程池形象例子如下图所示:
尾语
这篇博客到这里就结束啦,希望可以给大家带来帮助~~