说到线程池我们先来看看java中的常用阻塞队列
ArrayBlockingQueue 由数组组成的有界阻塞队列,按照先进先出的原则,并且要求设定初始大小
LikedBlockingQueue 一个由链表组成的无界(因为它的最大值是Integer.Max_Value,所以我把它认为是无界队列)队列
PriorityBlockingQueue 支持优先级排序的无界阻塞队列,默认是自然顺序
DelayQueue 使用优先级队列实现的无界队列,元素要求必需实现Delayed接口
SynchronousQueue 不存储任何元素的阻塞队列
LinkedTranferQueue 一个由链表组成的无界阻塞队列 transfer()必需要等消费者消费以后才会有返回值,TryTransfer()马上就有返回值
LinkedBlockingQueue 链表组成的双向阻塞队列
常用方法
| 方法 |
抛出异常 | 返回值 | 一直阻塞 |
超时推出 |
| 插入 | add | offer | put | offer(time) |
| 移除 | remove | poll | take | poll(time) |
| 检查 | element | peek | N/A | N/A |
jdk所有线程池的父类
ThreadPoolExecutor
各个参数含义
int corePoolSize 线程池中的核心线程数
int maximumPoolSize 允许最大的线程数 ,如果BlockingQueue也满了,并且小于它本身的时候就会创建新的线程
long keepAliveTime 线程空闲下来存活的时间,这个参数只有小于corePoolSize的时候才会有用
TimeUnit unit 存活的时间单位
ThreadFactory threadFactory创建线程的工厂,给新建的线程赋予名字
RejectedExecutionHandler handler 饱和策略
AbortPolicy:直接抛出异常,是属于默认值
CallerRunsPolicy:用调用者所在的线程来执行任务
DiscardOldestPolicy :丢弃阻塞队列最老的任务
DiscardPolicy:丢弃当前任务
jdk自带的线程池
Executors
FixedThreadPool:创建固定线程池数量,使用了无界队列
SingleThreadExector :创建单个线程,可用于需要保证顺序线程 ,使用了无界队列
CachedThreadPool:会根据需要来创建新线程,可用于执行短期异步任务
ScheduledThradPoolExecuto:需要定期执行的任务
合理配置线程池:
根据任务分为:计算密集型,IO密集型和混合型
cpu核心数:Runtime.getRuntime().availableProcessors()
对于计算密集型:cpu核心线程+1
对于IO密集型:建议使用计算密集数*2
对于混合型:建议拆分
注意:在使用线程开发的过程中,实现业务为主,不建议为了使用技术而使用技术。
建议使用 ExectorService pool=new ThreadPoolExecutot()这样的方式进行创建,对于RejectedExecutionHandler handler 饱和策略,建议实现RejectedExecutionHandler接口,做自己线程处理:
/**
* @Author zbf
* @DATA 2019/9/4 20:21
* @ClassIntroduction
*/
public class MyThread implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
//处理自己饱和策略,这里可以保存到数据库中,等待一段时间以后重新运行,也可以直接重新启动一个线程执行
new Thread(r).start();//建议转型为自己线程,
}
}
使用队列也建议使用有界队列进行创建,不建议使用无界队列
int cpu = Runtime.getRuntime().availableProcessors();
int corePoolSize=cpu+1;
ExecutorService pool=new ThreadPoolExecutor(corePoolSize*2,corePoolSize*4,3,
TimeUnit.SECONDS,new ArrayBlockingQueue<>(300),new ThreadPoolExecutor.DiscardPolicy());
线程提交
execute(Runnable r)
关闭线程池
shutdown():设置线程池的状态,只会中断所有还没有执行完成任务的线程
shutdownNow():设置线程池状态,还会尝试停止正在运行的或者暂停的任务的线程
537

被折叠的 条评论
为什么被折叠?



