一、线程池的概念
1.系统启动时,创建大量线程执行任务,任务执行后,线程会变成空闲状态,等待下一次任务
2.优点是,节省资源,因为不断启动和关闭线程,会过度消耗资源
原理:
结合代码图就可以理解该原理图了:
二、核心线程池:ThreadPoolExcutor
1.corePoolSize:线程池核心池大小,在创建线程池后,默认没有任何线程。当有任务才会创建一个线程去执行,直到线程数达到corePoolSize,之后的任务会放到队列中。表示线程池允许同时运行的最大线程数
2.maximumPoolSize:线程池允许的最大线程数。
3.keepAliveTime:表示线程没有任务时,最多保持多久会停止。默认情况下,只有线程池数大于corePoolSize,keepAliveTime才会起作用,然后超过时间的非核心线程,会shundown
4.unit:keepAliveTime的单位
5.workQueue:阻塞队列,用于存储等待执行的任务
5.1 有界队列ArrayBlockQueue:基于数组的先进先出队列,必须指定大小
5.2 无界队列LinkedBlockingQueue:基于链表的先进先出,如果没有指定大小,默认无限大
5.3 直接提交队列synchronousQueue:不会保存提交任务,直接新建线程来执行新的任务
6.threadFactory:线程工厂,用于创建线程
7.handler:表示当拒绝处理任务时的策略--当队列和线程池都已经饱和的时候
7.1 AbortPolicy:丢弃任务并抛出异常
7.2 CallerRunsPolicy:运行当前被丢弃的任务
7.3 DiscardOldestPolicy:丢弃队列中最老的请求,也就是即将执行的任务,并尝试再次提交当前任务
7.4 DiscardPolicy:丢弃任务,不会做任务处理
8.设置拒绝策略的二种方式
三、四种常用线程池
1.newCacheThreadPool():先看池中有没有以前建立的线程池,没有的话,创建新的线程;没有核心线程,有任务直接执行,无任务,60s后,回收线程,一般用于生存期很短的异步型任务
代码实现:
2.newFixedThreadPool(int n):创建可重用固定个数的线程池,以无界方式运行线程
3.newScheduledThreadPool(int n):创建定长线程池,支持定时及周期性任务
3.1 线程池.schedule(Thread,1,TimeUnit.SECONDS):延迟一秒执行
3.2 线程池.scheduleAtFixedRate(Thread,1,3,TimeUnit.SECONDS):延迟一秒后,每三秒执行
4.newSingleThreadExecutor:创建单线程的线程池,保证所有任务按照指定顺序执行
四、线程池的关闭
1.shundown():不会立即终止线程池,等所有任务缓存队列中的任务都执行才终止,不会接受新的任务
2.shundownNow():立即终止线程,并尝试打断执行执行的任务,清空任务缓存队列,返回未执行的任务