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

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

Java 定時器的多種實現方式

瀏覽:28日期:2022-08-11 10:08:35
目錄一、前言(1)Timer(2)DelayedQueue 延遲隊列(3)ScheduledThreadPoolExecutor(4)ScheduledThreadPoolExecutor一、前言

定時器有三種表現形式:

按固定周期定時執行 延遲一定時間后執行 指定某個時刻執行

JDK 提供了三種常用的定時器實現方式,分別為:

Timer DelayedQueue 延遲隊列 ScheduledThreadPoolExecutor(1)Timer

發現 eureka 中大量使用了 Timer 定時器:

Timer 屬于 JDK 比較早期版本的實現,它可以實現固定周期的任務,以及延遲任務。 Timer 會起動一個異步線程去執行到期的任務,任務可以只被調度執行一次,也可以周期性反復執行多次。

Timer 是如何使用的,示例代碼如下:

Timer timer = new Timer();timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() {// 業務代碼 }}, 5000, 5000); // 5s 后調度一個周期為 5s 的定時任務 TimerTask 是實現了 Runnable 接口的抽象類 Timer 負責調度和執行 TimerTask

Timer 的內部構造,如下:

public class Timer { // 小根堆,run操作 O(1)、新增 O(logn)、cancel O(logn) private final TaskQueue queue = new TaskQueue(); // 創建另外線程,任務處理,會輪詢 queue private final TimerThread thread = new TimerThread(queue); public Timer(String name) {thread.setName(name);thread.start(); }}

Timer 它是存在不少設計缺陷的,所以并不推薦用戶使用:

Timer 是單線程模式,如果某個 TimerTask 執行時間很久,會影響其他任務的調度。 Timer 的任務調度是基于系統絕對時間的,如果系統時間不正確,可能會出現問題。 TimerTask 如果執行出現異常,Timer 并不會捕獲,會導致線程終止,其他任務永遠不會執行。(2)DelayedQueue 延遲隊列

特征如下:

DelayedQueue 是 JDK 中一種可以延遲獲取對象的阻塞隊列,其內部是采用優先級隊列 PriorityQueue 存儲對象 DelayQueue 中的每個對象都必須實現 Delayed 接口,并重寫 compareTo 和 getDelay 方法

DelayedQueue 的使用方法如下:

public class DelayQueueTest { public static void main(String[] args) throws Exception {BlockingQueue<SampleTask> delayQueue = new DelayQueue<>();long now = System.currentTimeMillis();delayQueue.put(new SampleTask(now + 1000));delayQueue.put(new SampleTask(now + 2000));delayQueue.put(new SampleTask(now + 3000));for (int i = 0; i < 3; i++) { System.out.println(new Date(delayQueue.take().getTime()));} } static class SampleTask implements Delayed {long time;public SampleTask(long time) { this.time = time;}public long getTime() { return time;}@Overridepublic int compareTo(Delayed o) { return Long.compare(this.getDelay(TimeUnit.MILLISECONDS), o.getDelay(TimeUnit.MILLISECONDS));}@Overridepublic long getDelay(TimeUnit unit) { return unit.convert(time - System.currentTimeMillis(), TimeUnit.MILLISECONDS);} }}(3)ScheduledThreadPoolExecutor

JDK 提供了功能更加豐富的 ScheduledThreadPoolExecutor

public class ScheduledExecutorServiceTest { public static void main(String[] args) {ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);executor.scheduleAtFixedRate(() -> System.out.println('Hello World'), 1000, 2000, TimeUnit.MILLISECONDS); // 1s 延遲后開始執行任務,每 2s 重復執行一次 }}

ScheduledThreadPoolExecutor 使用了阻塞隊列 DelayedWorkQueue。

(4)ScheduledThreadPoolExecutor

線程應該是最常見的實現方案,創建一個線程執行任務即可,舉例幾個不同的寫法,代碼如下

4.1.使用thread + runnable

package com.yezi_tool.demo_basic.test;import org.springframework.stereotype.Component;import java.util.Date;@Componentpublic class ThreadTest { private Integer count = 0; public ThreadTest() {test1(); } public void test1() {new Thread(() -> { while (count < 10) {System.out.println(new Date().toString() + ': ' + count);count++;try { Thread.sleep(3000);} catch (InterruptedException e) { e.printStackTrace();} }}).start(); }}

4.2.使用線程池 + runnable

package com.yezi_tool.demo_basic.test;import org.springframework.stereotype.Component;import java.util.Date;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;@Componentpublic class ThreadTest { private static final ExecutorService threadPool = Executors.newFixedThreadPool(5);// 線程池 private Integer count = 0; public ThreadTest() {test2(); } public void test2() {threadPool.execute(() -> { while (count < 10) {System.out.println(new Date().toString() + ': ' + count);count++;try { Thread.sleep(3000);} catch (InterruptedException e) { e.printStackTrace();} }}); }}

以上就是Java 定時器的多種實現方式的詳細內容,更多關于Java 定時器的實現的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 鑫铭东办公家具一站式定制采购-深圳办公家具厂家直销 | 回转支承-转盘轴承-回转驱动生产厂家-洛阳隆达轴承有限公司 | 双段式高压鼓风机-雕刻机用真空泵-绍兴天晨机械有限公司 | 天助网 - 中小企业全网推广平台_生态整合营销知名服务商_天助网采购优选 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 河北码上网络科技|邯郸小程序开发|邯郸微信开发|邯郸网站建设 | 锌合金压铸-铝合金压铸厂-压铸模具-冷挤压-誉格精密压铸 | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | 杭州|上海贴标机-百科| 复盛空压机配件-空气压缩机-复盛空压机(华北)总代理 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 钛合金标准件-钛合金螺丝-钛管件-钛合金棒-钛合金板-钛合金锻件-宝鸡远航钛业有限公司 | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | 没斑啦-专业的祛斑美白嫩肤知识网站-去斑经验分享 | 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 一体化隔油提升设备-餐饮油水分离器-餐厨垃圾处理设备-隔油池-盐城金球环保产业发展有限公司 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | 柔性输送线|柔性链板|齿形链-上海赫勒输送设备有限公司首页[输送机] | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 一技任务网_有一技之长,就来技术任务网 | 清管器,管道清管器,聚氨酯发泡球,清管球 - 承德嘉拓设备 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 衬氟旋塞阀-卡套旋塞阀-中升阀门首页 | 除尘布袋_液体过滤袋_针刺毡滤料-杭州辉龙过滤技术有限公司 | 踏板力计,制动仪,非接触多功能速度仪,逆反射系数测试仪-创宇 | 密封圈_泛塞封_格莱圈-[东莞市国昊密封圈科技有限公司]专注密封圈定制生产厂家 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 湖南档案密集架,智能,物证,移动,价格-湖南档案密集架厂家 | 臻知网大型互动问答社区-你的问题将在这里得到解答!-无锡据风网络科技有限公司 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | 铸铝门厂家,别墅大门庭院大门,别墅铸铝门铜门[十大品牌厂家]军强门业 | 专业生物有机肥造粒机,粉状有机肥生产线,槽式翻堆机厂家-郑州华之强重工科技有限公司 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 |