电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

java 定時器線程池(ScheduledThreadPoolExecutor)的實現

瀏覽:95日期:2022-08-30 17:56:51

前言

定時器線程池提供了定時執行任務的能力,即可以延遲執行,可以周期性執行。但定時器線程池也還是線程池,最底層實現還是ThreadPoolExecutor,可以參考我的另外一篇文章多線程?精通ThreadPoolExecutor。

特點說明

1.構造函數

public ScheduledThreadPoolExecutor(int corePoolSize) { // 對于其他幾個參數在ThreadPoolExecutor中都已經詳細分析過了,所以這里,將不再展開 // 這里我們可以看到調用基類中的方法時有個特殊的入參DelayedWorkQueue。 // 同時我們也可以發現這里并沒有設置延遲時間、周期等參數入口。 // 所以定時執行的實現必然在DelayedWorkQueue這個對象中了。 super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue()); }

2.DelayedWorkQueue

DelayedWorkQueue是在ScheduledThreadPoolExecutor的一個內部類,實現了BlockingQueue接口里面存放任務隊列的數組如下:

private RunnableScheduledFuture<?>[] queue = new RunnableScheduledFuture<?>[INITIAL_CAPACITY];

我們分析過ThreadPoolExecutor,它從任務隊列中獲取任務的方式為poll和take兩種,所以看一下poll和take兩個方法的源碼,回顧一下,ThreadPoolExecutor它會調用poll或take方法,先poll,再take,只要其中一個接口有返回就行

public RunnableScheduledFuture<?> poll() { final ReentrantLock lock = this.lock; lock.lock(); try { RunnableScheduledFuture<?> first = queue[0]; // 這里有個getDelay,這是關鍵點,獲取執行延時時間 // 但是如果我們有延時設置的話,這就返回空了,然后就會調用take方法 if (first == null || first.getDelay(NANOSECONDS) > 0) return null; else return finishPoll(first); } finally { lock.unlock(); } }public RunnableScheduledFuture<?> take() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { for (;;) { RunnableScheduledFuture<?> first = queue[0]; if (first == null) available.await(); else { // 獲取延時時間 long delay = first.getDelay(NANOSECONDS); if (delay <= 0) return finishPoll(first); first = null; // don’t retain ref while waiting if (leader != null) available.await(); else { Thread 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(); } }

3.RunnableScheduledFuture

在ScheduledThreadPoolExecutor內部有一個ScheduledFutureTask類實現了RunnableScheduledFuture,ScheduledFutureTask這個類采用了裝飾者設計模式,在執行Runnable的方法基礎上還執行了一些額外的功能。我們需要特別注意幾個參數period、time。

(1)time

首先看一下time的作用,可以發現time是用于獲取執行延時時間的,也就是delay是根據time生成的

public long getDelay(TimeUnit unit) { return unit.convert(time - now(), NANOSECONDS); }

(2)period

這個參數不是說設置執行幾個周期,而是用于判斷是否需要按周期執行,以及執行周期,也就是本次執行與下次執行間隔的時間

// 判斷是否需要按周期執行,如果周期設置成0,不是無間隔執行,而是只執行一次,這個需要特別注意 public boolean isPeriodic() { return period != 0; }

private void setNextRunTime() { long p = period; if (p > 0) // 這里將周期加給time,這樣獲取的延遲時間就是周期時間了。 time += p; else time = triggerTime(-p); }

(3)執行

public void run() { // 先判斷是否為周期性的任務 boolean periodic = isPeriodic(); if (!canRunInCurrentRunState(periodic)) cancel(false); else if (!periodic) // 如果不是周期性的,就執行調用父類的run方法,也就是構造函數中傳入的Runnable對象的run方法。 ScheduledFutureTask.super.run(); // 在if的括號中先執行了任務 else if (ScheduledFutureTask.super.runAndReset()) { // 如果是周期性的,就需要設置下次執行的時間,然后利用reExecutePeriodic方法,將任務再次丟入任務隊列中。 // 這里尤其需要注意的是if中的邏輯執行失敗,如果沒有捕捉異常,那么后面的邏輯就不會再執行了,也就是說中間有一次執行失敗,后面這個周期性的任務就失效了。 setNextRunTime(); reExecutePeriodic(outerTask); } }

總結

ScheduledThreadPoolExecutor通過time參數,設置當前任務執行的等待時間,再通過period設置任務下次執行需要等待的時間。這兩個參數都不是設置在線程池中的,而是攜帶在任務中的,這就可以把線程池和任務進行完全解耦。注意點:(1)任務的執行等待時間是在隊列的take方法中的。(2)period參數設置成0,任務將只會執行一次,而不會執行多次(3)如果要自己實現周期性Task,周期性任務在執行過程中,一定要注意捕捉異常,否則某一次執行失敗,將導致后續的任務周期失效,任務將不再繼續執行。

到此這篇關于java 定時器線程池(ScheduledThreadPoolExecutor)的實現的文章就介紹到這了,更多相關java 定時器線程池內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 成都竞价托管_抖音代运营_网站建设_成都SEM外包-成都智网创联网络科技有限公司 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 橡胶弹簧|复合弹簧|橡胶球|振动筛配件-新乡市永鑫橡胶厂 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 电磁铁_推拉电磁铁_机械手电磁吸盘电磁铁厂家-广州思德隆电子公司 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 温州食堂承包 - 温州市尚膳餐饮管理有限公司 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | 潜水搅拌机-双曲面搅拌机-潜水推进器|奥伯尔环保 | 999范文网_优质范文下载写作帮手 | 钢丝绳探伤仪-钢丝绳检测仪-钢丝绳探伤设备-洛阳泰斯特探伤技术有限公司 | 油缸定制-液压油缸厂家-无锡大鸿液压气动成套有限公司 | 岩棉板|岩棉复合板|聚氨酯夹芯板|岩棉夹芯板|彩钢夹芯板-江苏恒海钢结构 | 上海公众号开发-公众号代运营公司-做公众号的公司企业服务商-咏熠软件 | 煤棒机_增碳剂颗粒机_活性炭颗粒机_木炭粉成型机-巩义市老城振华机械厂 | 螺杆真空泵_耐腐蚀螺杆真空泵_水环真空泵_真空机组_烟台真空泵-烟台斯凯威真空 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 安规_综合测试仪,电器安全性能综合测试仪,低压母线槽安规综合测试仪-青岛合众电子有限公司 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 钢结构-钢结构厂房-钢结构工程[江苏海逵钢构厂] | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 楼梯定制_楼梯设计施工厂家_楼梯扶手安装制作-北京凌步楼梯 | 氟氨基酮、氯硝柳胺、2-氟苯甲酸、异香兰素-新晨化工 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | 课件导航网_ppt课件_课件模板_课件下载_最新课件资源分享发布平台 | 华东师范大学在职研究生招生网_在职研究生招生联展网 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | 深圳市人通智能科技有限公司 | 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 生鲜配送系统-蔬菜食材配送管理系统-连锁餐饮订货配送软件-挪挪生鲜供应链管理软件 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 青岛侦探调查_青岛侦探事务所_青岛调查事务所_青岛婚外情取证-青岛狄仁杰国际侦探公司 |