日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Java簡單實現定時器

瀏覽:117日期:2022-08-13 15:13:48

本文實例為大家分享了Java簡單實現定時器的具體代碼,供大家參考,具體內容如下

一、定時器

定時器相當于一個任務管理器。有些任務可能現在執行, 有些任務可能過1個小時,甚至很久才會執行。定時器就是對這些任務進行管理監視, 如果一個任務執行時間到了,定時器就會將這個任務執行。 保證所有的任務都會在合適的時間執行。

二、定時器的實現

對于定時器的實現,我們可以劃分為3個部分。

1、 使用一個Task類描述每一個任務(里面包含任務的執行方法, 定時時間)。2、 使用優先級隊列管理這些任務類。

2.1 我們都知道優先級隊列底層實現是堆(以小根堆為例), 堆頂的元素是所有的元素的最小值。 我們以任務的定時時間為比較原則構建, 這樣就可以保證堆頂元素的任務執行時間是最短的(這樣的實現,我們需要在Task類內部定義比較規則-即重寫Comparable接口的CompareTo方法)。

2.2 當一個任務執行完畢, 就會從優先級隊列取出poll掉, 然后內部重新組織保證新的堆頂元素是定時時間最短的。

2.3 如果說堆頂的任務定時時間還沒有到達(當然后續的任務定時時間肯定會更長,不會被執行)

3、使用一個線程循環掃描優先級隊列, 相當于一個監控線程,循環判斷堆頂任務是否滿足執行時間。

三、定時器的組成

1、制定任務類Task

Task類包含任務的 執行方法 和 定時時間。

1.1 執行方法我采用封裝Runnable中run方法實現, 這樣做是為了后續添加任務時方便寫執行邏輯。1.2 定時時間就是long類型的變量1.3 制定比較規則, 后續優先級隊列中存放的是Task對象(而在內部構建時,需要比較兩個Task對象的),對于對象的比較, 我們以對象的定時時間為規則, 制定小根堆。

static class Task implements Comparable<Task>{//Runnable類中有一個run方法, 通過這個方法實現任務的執行private Runnable command;//time表示執行的時間private long time;//構造方法public Task(Runnable command, long time) { this.command = command; this.time = System.currentTimeMillis() + time; //將時間轉化為絕對時間}//執行任務的邏輯public void run() { command.run();}//定義比較方法 - 方便后續的優先級隊列構建@Overridepublic int compareTo(Task o) { return (int)(this.time - o.time);} }

2、監管線程&定時器對象Timer

監管線程Worker中包含優先級隊列(小根堆)queue 和 循環監管的流程。

Timer對象封裝了監管線程Woker 和 任務的添加方法schedule()

關于監管線程的優化

2.1 循環監控存在一個弊端,那就是一直循環判斷, 占用CPU資源。(假如堆首任務的執行是1小時后, 再次期間監管線程會跑1小時循環判斷。)

解決方法: 可以通過線程阻塞和喚醒來解決。在下面代碼有詳細注釋和實現。

2.1.1 如果任務1小時后執行, 我們讓監管線程wait(1小時), 但在此期間如果有新的任務添加進來(可能新的任務需要等30分鐘就可以執行,堆首元素發生變化) ,這時需要喚醒監管線程來重新判斷。(由于wait和notify方法不在用一個類中實現, 我們通過一個Object(mailBox)來阻塞、喚醒)

//檢測線程, 繼承Thread類,重寫內部run方法,屬于線程的創建方法之一。 static class Worker extends Thread { //優先級隊列 - JUC包里面private PriorityBlockingQueue<Task> queue = null;//為了對監管線程進行阻塞和喚醒,采用同一對象private Object mailBox = null; //構造函數public Worker(PriorityBlockingQueue<Task> queue, Object mailBox) { this.queue = queue; this.mailBox = mailBox;}@Overridepublic void run() { //實現具體的執行邏輯 while(true) {try { //1、取優先級隊列的隊首元素 Task task = queue.peek(); //2、比較隊首的元素的時間是否大于當前時間 if(task == null) {continue; } long curTime = System.currentTimeMillis(); if(task.time > curTime) {//時間還沒有到, 由于取出了任務, 需要重新放置回去//優化1: 空循環等待 - wait(time) 讓線程休眠time時間,然后在執行// 如果在等待期間有新的任務添加, 這個時候我們喚醒線程, 繼續判斷(因為存在新的時間過短需要立即執行)// 這個只需要添加一個新任務時, 喚醒即可//優化2: 訪問隊首元素而不是取出, 防止無所謂的刪除、插入。(維護優先級隊列是有消耗的)long gapTime = task.time - curTime;synchronized (mailBox) { mailBox.wait(gapTime);} } else {//直接執行//如果執行到了, 則會刪除頭部元素, 調用任務的執行過程。task = queue.take();task.run(); }}catch(InterruptedException e) { e.printStackTrace(); break;} }} } //定時器簡單實現 static class Timer {//定時器的實現步驟//1、用一個類描述任務//2、用優先級隊列管理這些任務, 比較方法通過任務的制定時間,每次取隊首元素// 隊首元素是執行時間最近的private PriorityBlockingQueue<Task> queue = new PriorityBlockingQueue<>();//3、用一個線程來循環掃描當前的阻塞隊列,判斷隊首的執行時間, 如果執行時間到了,那就執行。//4、創建一個Object對象,用于設置線程阻塞使用的, 存在線程阻塞, 添加任務時喚醒的操作private Object mailBox = new Object();//構造函數public Timer() { //創建線程 Worker worker = new Worker(queue, mailBox); worker.start();}//4、提供一個方法, 讓調用者能夠把任務安排起來public void schedule(Runnable command, long time) { Task task = new Task(command, time); queue.put(task); synchronized (mailBox) {mailBox.notify(); }} }

3、測試代碼

其中添加了4個任務, 分別是2s、5s、7s、10s后執行。

public static void main(String[] args) {Timer timer = new Timer();timer.schedule(new Runnable() { @Override public void run() {System.out.println('郝夢武一號任務執行, 執行代號:閃電; 定時時間:2s'); }}, 2000);timer.schedule(new Runnable() { @Override public void run() {System.out.println('郝夢武二號任務執行, 執行代號:暴風; 定時時間:5s'); }}, 5000);timer.schedule(new Runnable() { @Override public void run() {System.out.println('郝夢武三號任務執行, 執行代號:狂風; 定時時間:7s'); }}, 7000);timer.schedule(new Runnable() { @Override public void run() {System.out.println('郝夢武三號任務執行, 執行代號:地震; 定時時間:10s'); }}, 10000); }

4、測試結果

Java簡單實現定時器

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
三上悠亚国产精品一区二区三区| 免费精品一区| 九色精品91| 亚洲综合电影| 国产成人77亚洲精品www| 国产精品任我爽爆在线播放| 日本国产一区| 欧美日韩亚洲三区| 国产亚洲久久| 国产三级一区| 你懂的国产精品永久在线| 日本不卡的三区四区五区| 视频一区中文字幕精品 | 亚洲精品无吗| 亚洲一区二区网站| 视频一区国产视频| 婷婷亚洲精品| 国产精品亚洲欧美日韩一区在线 | 福利在线一区| 国产亚洲一区二区手机在线观看 | 欧美一级精品| 不卡一区综合视频| 亚洲作爱视频| 青草av.久久免费一区| 欧美黄色一区二区| 91精品婷婷色在线观看| 伊人影院久久| 日韩精品免费视频一区二区三区| 青青草精品视频| 捆绑调教美女网站视频一区| 日韩理论视频| 天堂va在线高清一区| 免费日韩成人| 亚洲精品三级| 国产一区日韩一区| 亚洲精品成人| 亚洲精品日韩久久| 色偷偷偷在线视频播放| 9999国产精品| 天堂а√在线最新版中文在线| 亚洲一区日韩在线| 久久99精品久久久野外观看| 亚洲精品一区二区妖精| 久久99蜜桃| 老鸭窝毛片一区二区三区| 国产精品一卡| 亚洲欧美久久久| 精品一级视频| 中文字幕一区二区精品区| 91欧美日韩| 911精品国产| 日韩欧美看国产| 日本视频一区二区| 久久电影tv| 性一交一乱一区二区洋洋av| 天使萌一区二区三区免费观看| 精品资源在线| 欧美日韩国产综合网| 在线视频观看日韩| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 亚洲一区观看| av中文资源在线资源免费观看| 久久xxxx| 婷婷亚洲综合| 伊人久久av| 欧美国产极品| 国产精品一线天粉嫩av| 婷婷亚洲成人| 日韩国产一区二| 老牛国产精品一区的观看方式| 高清一区二区| 精品三级av| 国产精品videossex久久发布 | 国产精品久一| 日韩精品高清不卡| 日韩精品欧美| 日韩精品2区| 精品国产乱码| 国产乱码精品一区二区三区四区| 亚洲激情二区| 九九在线精品| 亚洲激情精品| 99国产精品免费视频观看| 国产专区精品| 国产欧美一区二区三区精品酒店 | 精品一区在线| 亚洲福利精品| 精品一区亚洲| 午夜欧美理论片| 亚洲一区二区毛片| 美女精品在线| 蜜臀精品一区二区三区在线观看| 女人天堂亚洲aⅴ在线观看| 久久久久中文| 99精品视频在线| 国内揄拍国内精品久久| 精品久久91| 在线手机中文字幕| 成人看片网站| av亚洲在线观看| 婷婷精品进入| 9色国产精品| 综合干狼人综合首页| 亚洲精品人人| 久久精品97| 色欧美自拍视频| 99久久久久久中文字幕一区| 91av亚洲| 久久亚洲电影| 日韩和欧美的一区| 日韩av三区| 精品视频网站| 亚洲福利一区| 日韩av中文字幕一区| 国产精品一区二区三区av| 免费在线亚洲| 香蕉视频亚洲一级| 午夜在线观看免费一区| 欧美永久精品| 精品国产精品国产偷麻豆| 亚洲91精品| 免费视频一区二区| 麻豆中文一区二区| 亚洲免费观看| 国产亚洲一区| 久久久精品区| 自拍日韩欧美| 国产精品一区二区美女视频免费看| 国产一区二区三区不卡视频网站 | 在线午夜精品| 国产精品天天看天天狠| 色天使综合视频| 蜜臀av国产精品久久久久| 国产乱子精品一区二区在线观看| 精品一区二区三区四区五区| 亚洲天堂一区二区| 亚洲精品麻豆| 精品欧美一区二区三区在线观看| 亚洲日韩视频| 日韩国产综合| 欧美日韩a区| 欧美日韩精品一区二区视频| 午夜电影一区| 99久久婷婷这里只有精品| 91精品国产自产在线丝袜啪| 欧美日韩一二| 精品九九在线| 国产情侣久久| 亚洲中字黄色| 麻豆精品新av中文字幕| 亚洲深夜av| 蜜臀久久精品| 久久亚洲精精品中文字幕| 蜜桃视频在线观看一区二区| 久草免费在线视频| 国产精品多人| 日韩精品亚洲专区| 欧美日韩精品一区二区视频| 欧美激情三区| 国产欧美激情| 深夜福利一区| 亚洲综合三区| 午夜视频精品| 亚洲激情精品| 国产黄大片在线观看| 久久国产麻豆精品| 日韩精品一二区| 亚洲在线网站| 影院欧美亚洲| 亚洲福利专区| 亚洲成人va| 啪啪国产精品| 91一区二区| 久久精品国产99国产| 亚洲精品人人| 久久影院一区二区三区| 久久久国产精品一区二区中文| 精品视频一区二区三区四区五区| 日本免费在线视频不卡一不卡二| 国产资源在线观看入口av| 日本欧美一区二区| 日韩精品一级二级| 国产精品日韩久久久| 婷婷亚洲综合| 亚洲电影在线一区二区三区| 午夜国产精品视频免费体验区| 不卡在线一区二区| 在线综合欧美| 国产精品老牛| 免费成人性网站| 日本一区二区中文字幕| 国产日韩一区二区三区在线播放| 欧美亚洲专区| 国产在线日韩精品| 成人黄色av| 中文字幕av一区二区三区人 | 丰满少妇一区| 成人久久一区| 日韩欧美一区二区三区在线视频 | 日韩视频网站在线观看|