当前位置: 首页 > news >正文

制作报价网站网站版面做得好的

制作报价网站,网站版面做得好的,wordpress 主题预览空白,做流量网站有收入吗大家好#xff0c;我是此林。 定时任务是我们项目中经常会遇到的一个场景。那么如果让我们手动来实现一个定时任务框架#xff0c;我们会怎么做呢#xff1f; 1. 基础实现#xff1a;简单的线程池时间轮询 最直接的方式是创建一个定时任务线程池#xff0c;用户每提交一…大家好我是此林。 定时任务是我们项目中经常会遇到的一个场景。那么如果让我们手动来实现一个定时任务框架我们会怎么做呢 1. 基础实现简单的线程池时间轮询 最直接的方式是创建一个定时任务线程池用户每提交一个定时任务就分配一个线程去执行。每个线程使用 Thread.sleep() 或者 while (true) 不断轮询检查当前时间是否达到了任务的触发时间。 这种方式的问题 一个线程只能执行一个任务如果定时任务很多线程池的线程很快就会被占满导致新的任务无法执行。比如机器是 4 核 CPU最多可能支持 10 个线程同时执行任务。超过这个数量的任务只能阻塞等待影响可用性。 一般定时任务都是要永久执行不可能就执行一次或几次就丢弃了。在这种方案下一台机器只能执行那几个任务因为那几个任务一直在占用线程池其他任务无法执行。 2. 优化方案任务列表线程池 为了解决上面的问题我们可以改进方案使用 检查任务-派发任务 模式 创建一个任务列表用来存放所有待执行的任务。 使用一个独立的线程不断扫描任务列表找到即将到达触发时间的任务。 将快到触发时间的任务提交给线程池线程池里的线程只负责执行任务而不需要一直轮询等待。 任务执行完后线程自动释放回到线程池提高并发能力。 这种方式的优点 线程池里的线程专注执行任务不需要每个线程都去检测触发时间提高了 CPU 的利用率。 可以同时执行多个任务避免任务阻塞导致的执行延迟。 任务调度逻辑集中管理便于扩展和优化。 存在的问题任务过期 但这种方式也有一个问题当任务列表里有几百、几千个任务时扫描任务的线程可能处理不过来导致一些任务在被扫描到时已经过期了。 那你可能会说可以增加时间啊比如提前两秒就提交入线程池。但这样会导致触发时间精度下降比如某个任务严格要求每3秒执行一次提前两秒去执行显然是不行的。 3. 进一步优化任务预读时间轮 为了解决任务过期问题我们接下来引入 任务预读 和 时间轮 的概念。 这里就援引一张网络上的时间轮图片。 时间轮的核心思想 可以把时间轮想象成 时钟表 时间轮 一个圆形数组环形结构每个刻度 一秒钟时间槽位slot当前指针 记录当前时间进度任务 被分配到不同的槽位等指针走到对应的槽位时执行 当时间轮的指针随着时间推进时就会触发当前槽位内的任务执行。 同样的我们开启一个独立的线程不断扫描任务列表通过任务的触发时间计算每个任务在时间轮上的槽位。如下图为 XXL-JOB 源码。 JobScheduleHelper.java Thread scheduleThread 部分源码 通过任务触发时间计算在 时间轮 上的槽位把任务添加入 时间轮 相应的槽位一个槽位上可以同时存在多个任务用一个列表维护更新任务的下一次触发时间。 上述线程的把任务添加到时间轮的操作称之为预读 同时还有一个独立线程 ringThread可以理解为时间轮上的 指针 。它通过 while 循环不断获取当前的秒数java.util.Calendar。 int nowSecond Calendar.getInstance().get(Calendar.SECOND); 通过对当前秒数nowSecond对60秒取模去时间轮里相应的槽位得到相应的任务列表提交给线程池执行任务JobTriggerPoolHelper。 如上操作检查任务的线程scheduleThread 无需等到任务即将到达触发时间时再向线程池提交任务只需要预读任务加入到时间轮即可。派发任务的工作由 指针ringThread完成即可。从而实现了防止了任务的过期保证了精准触发。 4. XXL-JOB任务调度源码 JobScheduleHelper.java XXL-JOB 的时间轮没有使用环形结构而是一个ConcurrentHashMap。后续是对60取模来实现类似的循环功能。 scheduleThread 由于调度中心将来可能会集群部署所以这里使用 select...for update 的悲观锁保证在同一时刻只能有一个调度中心在调度任务防止任务重复调度。 XXL-JOB的MySQL表有个任务表这里默认一次最多读前6000个任务到内存任务列表中preReadCount 6000PRE_READ_MS 5000即5秒。 所以这里读取的任务列表是未来5秒内将要触发的任务最多前6000个防止OOM或线程池来不及处理 遍历任务列表对60取模计算出槽位将任务放入时间轮的对位槽位。 问如果一个任务每300秒执行一次呢是不是应该还有个记录圈数字段呢 答由于预读操作是未来5秒内将要触发的任务所以不需要额外记录圈数这个地方也是XXL-JOB和一般时间轮稍微不一样的点。 ringThread 这里的任务触发会把任务添加到线程池里线程池并行地通过自研RPC的方式通知执行器执行。 分布式环境下调度中心和执行器分别部署 JobTriggerPoolHelper.java 这里有两个线程池fastTriggerPool 和 slowTriggerPool。 线程池选择逻辑 默认情况下任务会分配给 fastTriggerPool即高频率触发的线程池。如果某个任务在过去一分钟内超时超过 10 次即 jobTimeoutCount 超过 10那么该任务会被分配到 slowTriggerPool即低频率触发的线程池。这是为了 限制高频超时任务对资源的占用避免它们占用过多线程池资源影响正常任务的调度。 源码见下图。
http://www.hkea.cn/news/14414338/

相关文章:

  • 怎么做单位网站电商网站开发的项目描述
  • 国内优秀个人网站欣赏wordpress克隆
  • 做网站每年需要多少维护费江西省工程建设信息官方网站
  • php大型网站开发视频上海网站开发哪家好薇
  • 石柱土家族网站建设推广关键词排名查询
  • 建站之星服务器seo公司是干嘛的
  • 做网站时的尺寸dedecms中英文网站 模板
  • 网站做微信登录百度浏览器广告怎么投放
  • 自助建站申请怎么查自己的网站备案编号
  • 沛县做网站深圳东门希尔顿欢朋酒店
  • 网站的ftp广州网站建设 粤icp
  • 广州网站建设推荐q479185700霸屏门店客户管理软件
  • 个体工商户可以搞网站建设百度快照优化seo
  • 中山做百度网站的公司seo软文推广
  • 琼海做网站wordpress 开启多站点
  • 网站外链是友情连接吗小红书推广运营
  • 做网站模版与定制的区别外贸公司网站如何做网上推广
  • 电视剧下载网站 免费糖醋蒜怎样做私人订制旅游网站建设
  • 关于网站建设的问题站长seo查询
  • php 导航网站安康相亲平台
  • 湖北现代城市建设集团网站企业网站实名认证怎么做
  • win10可以自己做网站wordpress摘要 字数
  • 建设部网站查造价师wordpress怎么删除目录
  • php网站开发app接口网站配色方案 对比色
  • 北京网站建设策划重点培育学科建设网站
  • 网站模板之家免费模板网站建设的宗旨
  • 百度网站推广电话关于网站开发的外文书籍
  • 数学网站建设方法it程序员工资一般多少
  • 网站中图片下移怎么做建信金融科技有限责任公司
  • 做网站主页乐清门户网站