线程池学习(重点) | 乐文库-凯发k8官网下载客户端

为什么需要线程池?

因为频繁的创建和销毁线程需要大量时间和资源。为了防止资源不足,应该尽可能减少线程的创建和销毁,使用已经存在的线程。

线程池是线程的容器,其内部有多个线程,可以重复使用,这样就可以避免反复创建销毁线程消耗过多资源

数据库连接池跟线程池是一样的道理。

数据库的连接和断开都是耗时耗资源的操作,应该减少连接断开次数,尽可能使用已经有的连接。

数据库连接池就是预先创建一组连接,用的时候取,用完就放回。减少连接断开的次数,提高利用率。 

java里面线程池的顶级接口时excutor,但是真正的线程池接口时excutorservice,默认的实现类是threadpoolexcutor。excutors是线程池创建工厂类(生产线程池的工厂) 也是调用的threadpoolexcutor

excutors提供的四种线程池 

1.newcachedthreadpool 最大线程数可无限扩大的线程池,容易积压大量任务造成oom

2.newsinglethreadpool核心线程数为1最大线程数为1 但是等待队列2的31次-1容易积压大量请求oom

3.newfixedthreadpool线程数固定但是阻塞队列最大为2的31次-1

4.newscheduledthreadpool 最大线程数无限,容易积压大量任务oom 

 

不建议使用excutors提供的四种线程池,需要自己创建线程池,创建之前就必须了解线程池的参数

 

1.corepoolsize  核心线程数

2.maxmumpoolsize 最大线程数

3.keepalivetime 线程最长闲置时间

4.unit 线程最长闲置时间的单位

5.workqueue 阻塞队列的大小

6.threadfactory 线程制造工厂

7.rejectedexcutionhandler 拒绝策略

线程池工作流程

 

 

4种拒绝策略 

1.abortpolicy 直接抛出异常

2.callrunnerspolicy 将任务返回给调用者

3.discardoldestpolicy把等待队列中等待最久的任务抛弃,加入新的任务并提交

4.discardpolicy 什么都不做不抛出异常不做任何处理,如果允许任务丢失这是最好的策略

线程池的关闭:

shutdown 不会立刻停止,不接受新的任务把所有任务做完再停止

shudownnow 立刻停止线程池 并试图打断当前运行的任务,返回未执行的任务。

本文来自网络,不代表乐文库立场,如若转载,请注明出处:https://www.lewenku.com/?p=494147

网站地图