文章目录
线程池(重点)
线程池介绍
什么是线程池
线程池就是一个可以复用线程的技术。
不使用线程池的问题:
如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能。
线程池工作原理:
例如线程池中最多可以允许创建三个工作线程, 也叫核心线程, 前面三个任务来的时候会给前面三个任务单独创建三个线程; 但是后面任务再来的时候, 因为创建的工作线程已达到最大数, 那么后面的任务就会进入任务队列中排队等待; 等前面的任务执行完成, 有空闲的线程的时候使用空闲的线程依次执行任务队列中的任务
实现线程池的方式
谁代表线程池
JDK 5.0起提供了
代表线程池的接口:ExecutorService
如何得到线程池对象
- 方式一:使用ExecutorService的实现类ThreadPoolExecutor自创建一个线程池对象
- 方式二:使用Executors(线程池的工具类)调用方法返回不同特点的线程池对象
方式一: 实现类ThreadPoolExecutor
ThreadPoolExecutor构造器的参数
ThreadPoolExecutor的构造器有如下参数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
参数介绍:
- 参数一:指定线程池的线程数量(核心线程): corePoolSize ----> 不能小于0
- 参数二:指定线程池可支持的最大线程数: maximumPoolSize ----> 最大数量 >= 核心线程数量
- 参数三:指定临时线程的最大存活时间: keepAliveTime ----> 不能小于0
- 参数四:指定存活时间的单位(秒、分、时、天): unit ----> 时间单位
- 参数五:指定任务队列: workQueue ----> 不能为null
- 参数六:指定用哪个线程工厂创建线程: threadFactory ----> 不能为null
- 参数七:指定线程忙,任务满的时候,新任务拒绝策略: handler ----> 不能为null
新任务拒绝策略:
策略
详解
ThreadPoolExecutor.AbortPolicy
丢弃任务并抛出RejectedExecutionException异常。是默认的策略
ThreadPoolExecutor.DiscardPolicy
丢弃任务,但是不抛出异常 这是不推荐的做法
ThreadPoolExecutor.DiscardOl