设为首页 加入收藏

TOP

12分钟从Executor自顶向下彻底搞懂线程池(九)
2023-09-09 10:25:36 】 浏览:112
Tags:12分 钟从 Executor 向下彻 程池
ad thisThread = Thread.currentThread();                              leader = thisThread;                              try {                                  available.awaitNanos(delay);                             } finally {                                  if (leader == thisThread)                                      leader = null;                             }                         }                     }                 }             } finally {                  if (leader == null && queue[0] != null)                      available.signal();                  lock.unlock();             }         }

这两个定时方法一个以任务开始为周期起点、另一个以任务结束为周期起点

获取定时任务的流程是相同的,只是它们构建的定时任务中延迟的时间不同

定时任务使用period 区别,为正数周期起点为任务开始,为负数时周期起点为任务结束

总结

本篇文章围绕线程池,深入浅出的讲解池化技术,Executor,线程池的参数、配置、实现原理、处理异常、关闭等

使用池化技术能够节省频繁创建、关闭的开销,提升响应速度,方便管理,常应用于线程池、连接池等

Executor框架将工作任务与执行(线程池)解耦分离,工作任务分为无返回值的Runnable和有返回值的Callable

Executor实际只处理Runnable任务,会将Callable任务封装成FutureTask适配Runnable执行

线程池使用工作队列来管理线程,线程执行完任务会从阻塞队列取任务执行,当非核心线程空闲一定时间后会被关闭

线程池执行时,如果工作队列线程数量小于核心线程数,则创建线程来执行(相当预热)

如果工作队列线程数量大于核心线程数量,并且阻塞队列未满则放入阻塞队列

如果阻塞队列已满,还未达到最大线程数量则创建非核心线程执行任务

如果已达到最大线程数量则使用拒绝策略

配置参数CPU密集型为CPU核数+1;IO密集型为2倍CPU核数;具体配置需要测试

处理异常可以直接捕获任务,Callable可以捕获get,也可以继承线程池实现afterExecutor记录异常,还可以在创建线程时就设置处理未捕获异常方法

处理定时任务的线程池由延迟队列实现,时间越短的定时任务越先执行,线程会从延迟队列中获取定时任务(时间已到的情况),时间未到就等待

最后(不要白嫖,一键三连求求拉~)

本篇文章被收入专栏 由点到线,由线到面,深入浅出构建Java并发编程知识体系,感兴趣的同学可以持续关注喔

本篇文章笔记以及案例被收入 gitee-StudyJavagithub-StudyJava 感兴趣的同学可以stat下持续关注喔~

案例地址:

Gitee-JavaConcurrentProgramming/src/main/java/D_ThreadPool

Github-JavaConcurrentProgramming/src/main/java/D_ThreadPool

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 发布!

首页 上一页 6 7 8 9 下一页 尾页 9/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇适配器模式:如何让不兼容的接口.. 下一篇原型模式和深拷贝,浅拷贝

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目