线程池
线程池概述
线程池就是一个可以复用线程的技术
不使用线程池的问题
如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能
线程池的工作原理
线程池实现的API 参数
代表线程池的接口: ExecutorService
如何得到线程池对象
方式一 : 使用ExecutorService的实现类ThreadPoolExecutor自创建一个线程池对象
方式二 : 使用Executors(线程池的工具类)调用方法返回不同特点的线程池对象
ThreadPoolExecutor构造器参数说明
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
参数一:指定线程池的线程数量(核心线程):corePoolSize------>不能小于0
参数二:指定线程池可支持的最大线程数 : maxmumPoolSize------>最大数量 >= 核心线程数量
参数三:指定临时线程的最大存活时间 : keepAliveTime------>不能小于0
参数四:指定存活时间的单位(秒 分 时 天):unit------>时间单位
参数五:指定任务队列:workQueue------>不能为null
参数六:指定用哪个工厂创建线程:threadFactory------>不能为null
参数七:指定线程忙,任务满的时候,新任务来了怎么办:handler------>不能为null
常见面试题
1.临时线程什么时候创建?
新任务提交时发现核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建临时线程
2.什么时候会开始拒绝任务?
核心线程和临时线程都在忙,任务队列也满了,新的任务过来的时候才会开始任务拒绝
线程池处理Runnable任务
ExecutorService的常用方法
方法名称 | 说明 |
---|---|
void execute(Runnable command) | 执行任务/命令,没有返回值,一般用来执行Runnable任务 |
Future submit(Callable task) | 执行任务,返回未来任务对象获取线程结果,一般拿来执行Callable任务 |
void shutdown() | 等任务执行完毕后关闭线程池 |
List shutdown() | 立刻关闭,停止正在执行的任务,并返回队列中未执行的任务 |
package ThreadPool;
import java.util.concurrent.*;
public class ThreadPoolDemo1 {
public static void main(String[] args) {
//1.创建线程池对象
/**
* public ThreadPoolExecutor(int corePoolSize,
* int maximumPoolSize,
* long keepAliveTime,
* TimeUnit unit,
* BlockingQueue<Runnable> workQueue,
* ThreadFactory threadFactory,
* RejectedExecutionHandler handler)
*/
ExecutorService pool &#