①. ThreadPoolExecutor谈谈你的理解?
- ①. 为什么使用线程池,优势?
线程池做的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建
后启动这些任务,如果显示超过了最大数量,超出的数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行.
它的主要特点为:线程复用 | 控制最大并发数 | 管理线程.
②. 线程池如何使用(Java中的线程池是通过Executor框架实现的,该框架中用到了Executor,Executors,ExecutorService,ThreadPoolExecutor这几个类)
- ③. 方法详解与代码实现
三个方法(掌握)
(1).Executors.newFixedThreadPool(int) : 一池定线程
(2).Executors.newSingleThreadExecutor( ) : 一池一线程
(3).Executors.newCachedThreadPool( ) : 一池N线程
/* //看cpu的核数 //System.out.println(Runtime.getRuntime().availableProcessors()); * 第四种获取/使用java多线程的方式,线程池 * */ public class ExecutorTest { public static void main(String[] args) { //ExecutorService threadPool= Executors.newFixedThreadPool(5);//一池5个处理线程 //ExecutorService threadPool=Executors.newSingleThreadExecutor();//一池一线程 ExecutorService threadPool=Executors.newCachedThreadPool();//一池N线程 try { for (int i = 1; i <= 10; i++) { //使用 threadPool.execute(() -> { //模拟10个用户来办理业务,每个用户就是一个来自外部的请求线程 System.out.println(Thread.currentThread().getName() + "\t 办理业务~!"); }); //try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) {e.printStackTrace();} } }catch (Exception e){ }finally { //关闭 threadPool.shutdown(); } } }
②. 线程池的七大参数
①. corePoolSize:线程池中的常驻核心线程数
在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行请求任务,近似理解为今日当值线程
当线程池中的线程数目达到corePoolSize后,就会把到达的任务放入到缓存队列当中.
②. maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1
③. keepAliveTime:多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁直到只剩下corePoolSize个线程为止(非核心线程)
④. unit:keepAliveTime的单位
⑤. workQueue:任务队列,被提交但尚未被执行的任务(候客区)
⑥. threadFactory:表示生成线程池中工作线程的线程工厂,用户创建新线程,一般用默认即可(银行网站的logo | 工作人员的制服 | 胸卡等)
⑦. handler:拒绝策略,表示当线程队列满了并且工作线程大于等于线程池的最大显示 数(maxnumPoolSize)时如何来拒绝