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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java簡(jiǎn)單手寫(xiě)版本實(shí)現(xiàn)時(shí)間輪算法

瀏覽:214日期:2022-08-14 17:38:25
時(shí)間輪

關(guān)于時(shí)間輪的介紹,網(wǎng)上有很多,這里就不重復(fù)了

核心思想 一個(gè)環(huán)形數(shù)組存儲(chǔ)時(shí)間輪的所有槽(看你的手表),每個(gè)槽對(duì)應(yīng)當(dāng)前時(shí)間輪的最小精度 超過(guò)當(dāng)前時(shí)間輪最大表示范圍的會(huì)被丟到上層時(shí)間輪,上層時(shí)間輪的最小精度即為下層時(shí)間輪能表達(dá)的最大時(shí)間(時(shí)分秒概念) 每個(gè)槽對(duì)應(yīng)一個(gè)環(huán)形鏈表存儲(chǔ)該時(shí)間應(yīng)該被執(zhí)行的任務(wù) 需要一個(gè)線程去驅(qū)動(dòng)指針運(yùn)轉(zhuǎn),獲取到期任務(wù)

以下給出java 簡(jiǎn)單手寫(xiě)版本實(shí)現(xiàn)

代碼實(shí)現(xiàn)

時(shí)間輪主數(shù)據(jù)結(jié)構(gòu)

/** * @author apdoer * @version 1.0 * @date 2021/3/22 19:31 */@Slf4jpublic class TimeWheel { /** * 一個(gè)槽的時(shí)間間隔(時(shí)間輪最小刻度) */ private long tickMs; /** * 時(shí)間輪大小(槽的個(gè)數(shù)) */ private int wheelSize; /** * 一輪的時(shí)間跨度 */ private long interval; private long currentTime; /** * 槽 */ private TimerTaskList[] buckets; /** * 上層時(shí)間輪 */ private volatile TimeWheel overflowWheel; /** * 一個(gè)timer只有一個(gè)delayqueue */ private DelayQueue<TimerTaskList> delayQueue; public TimeWheel(long tickMs, int wheelSize, long currentTime, DelayQueue<TimerTaskList> delayQueue) { this.currentTime = currentTime; this.tickMs = tickMs; this.wheelSize = wheelSize; this.interval = tickMs * wheelSize; this.buckets = new TimerTaskList[wheelSize]; this.currentTime = currentTime - (currentTime % tickMs); this.delayQueue = delayQueue; for (int i = 0; i < wheelSize; i++) { buckets[i] = new TimerTaskList(); } } public boolean add(TimerTaskEntry entry) { long expiration = entry.getExpireMs(); if (expiration < tickMs + currentTime) { //到期了 return false; } else if (expiration < currentTime + interval) { //扔進(jìn)當(dāng)前時(shí)間輪的某個(gè)槽里,只有時(shí)間大于某個(gè)槽,才會(huì)放進(jìn)去 long virtualId = (expiration / tickMs); int index = (int) (virtualId % wheelSize); TimerTaskList bucket = buckets[index]; bucket.addTask(entry); //設(shè)置bucket 過(guò)期時(shí)間 if (bucket.setExpiration(virtualId * tickMs)) {//設(shè)好過(guò)期時(shí)間的bucket需要入隊(duì)delayQueue.offer(bucket);return true; } } else { //當(dāng)前輪不能滿足,需要扔到上一輪 TimeWheel timeWheel = getOverflowWheel(); return timeWheel.add(entry); } return false; } private TimeWheel getOverflowWheel() { if (overflowWheel == null) { synchronized (this) {if (overflowWheel == null) { overflowWheel = new TimeWheel(interval, wheelSize, currentTime, delayQueue);} } } return overflowWheel; } /** * 推進(jìn)指針 * * @param timestamp */ public void advanceLock(long timestamp) { if (timestamp > currentTime + tickMs) { currentTime = timestamp - (timestamp % tickMs); if (overflowWheel != null) {this.getOverflowWheel().advanceLock(timestamp); } } }}

定時(shí)器接口

/** * 定時(shí)器 * @author apdoer * @version 1.0 * @date 2021/3/22 20:30 */public interface Timer { /** * 添加一個(gè)新任務(wù) * * @param timerTask */ void add(TimerTask timerTask); /** * 推動(dòng)指針 * * @param timeout */ void advanceClock(long timeout); /** * 等待執(zhí)行的任務(wù) * * @return */ int size(); /** * 關(guān)閉服務(wù),剩下的無(wú)法被執(zhí)行 */ void shutdown();}

定時(shí)器實(shí)現(xiàn)

/** * @author apdoer * @version 1.0 * @date 2021/3/22 20:33 */@Slf4jpublic class SystemTimer implements Timer { /** * 底層時(shí)間輪 */ private TimeWheel timeWheel; /** * 一個(gè)Timer只有一個(gè)延時(shí)隊(duì)列 */ private DelayQueue<TimerTaskList> delayQueue = new DelayQueue<>(); /** * 過(guò)期任務(wù)執(zhí)行線程 */ private ExecutorService workerThreadPool; /** * 輪詢(xún)delayQueue獲取過(guò)期任務(wù)線程 */ private ExecutorService bossThreadPool; public SystemTimer() { this.timeWheel = new TimeWheel(1, 20, System.currentTimeMillis(), delayQueue); this.workerThreadPool = Executors.newFixedThreadPool(100); this.bossThreadPool = Executors.newFixedThreadPool(1); //20ms推動(dòng)一次時(shí)間輪運(yùn)轉(zhuǎn) this.bossThreadPool.submit(() -> { for (; ; ) {this.advanceClock(20); } }); } public void addTimerTaskEntry(TimerTaskEntry entry) { if (!timeWheel.add(entry)) { //已經(jīng)過(guò)期了 TimerTask timerTask = entry.getTimerTask(); log.info('=====任務(wù):{} 已到期,準(zhǔn)備執(zhí)行============',timerTask.getDesc()); workerThreadPool.submit(timerTask); } } @Override public void add(TimerTask timerTask) { log.info('=======添加任務(wù)開(kāi)始====task:{}', timerTask.getDesc()); TimerTaskEntry entry = new TimerTaskEntry(timerTask, timerTask.getDelayMs() + System.currentTimeMillis()); timerTask.setTimerTaskEntry(entry); addTimerTaskEntry(entry); } /** * 推動(dòng)指針運(yùn)轉(zhuǎn)獲取過(guò)期任務(wù) * * @param timeout 時(shí)間間隔 * @return */ @Override public synchronized void advanceClock(long timeout) { try { TimerTaskList bucket = delayQueue.poll(timeout, TimeUnit.MILLISECONDS); if (bucket != null) {//推進(jìn)時(shí)間timeWheel.advanceLock(bucket.getExpiration());//執(zhí)行過(guò)期任務(wù)(包含降級(jí))bucket.clear(this::addTimerTaskEntry); } } catch (InterruptedException e) { log.error('advanceClock error'); } } @Override public int size() { //todo return 0; } @Override public void shutdown() { this.bossThreadPool.shutdown(); this.workerThreadPool.shutdown(); this.timeWheel = null; }}

存儲(chǔ)任務(wù)的環(huán)形鏈表

/** * @author apdoer * @version 1.0 * @date 2021/3/22 19:26 */@Data@Slf4jclass TimerTaskList implements Delayed { /** * TimerTaskList 環(huán)形鏈表使用一個(gè)虛擬根節(jié)點(diǎn)root */ private TimerTaskEntry root = new TimerTaskEntry(null, -1); { root.next = root; root.prev = root; } /** * bucket的過(guò)期時(shí)間 */ private AtomicLong expiration = new AtomicLong(-1L); public long getExpiration() { return expiration.get(); } /** * 設(shè)置bucket的過(guò)期時(shí)間,設(shè)置成功返回true * * @param expirationMs * @return */ boolean setExpiration(long expirationMs) { return expiration.getAndSet(expirationMs) != expirationMs; } public boolean addTask(TimerTaskEntry entry) { boolean done = false; while (!done) { //如果TimerTaskEntry已經(jīng)在別的list中就先移除,同步代碼塊外面移除,避免死鎖,一直到成功為止 entry.remove(); synchronized (this) {if (entry.timedTaskList == null) { //加到鏈表的末尾 entry.timedTaskList = this; TimerTaskEntry tail = root.prev; entry.prev = tail; entry.next = root; tail.next = entry; root.prev = entry; done = true;} } } return true; } /** * 從 TimedTaskList 移除指定的 timerTaskEntry * * @param entry */ public void remove(TimerTaskEntry entry) { synchronized (this) { if (entry.getTimedTaskList().equals(this)) {entry.next.prev = entry.prev;entry.prev.next = entry.next;entry.next = null;entry.prev = null;entry.timedTaskList = null; } } } /** * 移除所有 */ public synchronized void clear(Consumer<TimerTaskEntry> entry) { TimerTaskEntry head = root.next; while (!head.equals(root)) { remove(head); entry.accept(head); head = root.next; } expiration.set(-1L); } @Override public long getDelay(TimeUnit unit) { return Math.max(0, unit.convert(expiration.get() - System.currentTimeMillis(), TimeUnit.MILLISECONDS)); } @Override public int compareTo(Delayed o) { if (o instanceof TimerTaskList) { return Long.compare(expiration.get(), ((TimerTaskList) o).expiration.get()); } return 0; }}

存儲(chǔ)任務(wù)的容器entry

/** * @author apdoer * @version 1.0 * @date 2021/3/22 19:26 */@Dataclass TimerTaskEntry implements Comparable<TimerTaskEntry> { private TimerTask timerTask; private long expireMs; volatile TimerTaskList timedTaskList; TimerTaskEntry next; TimerTaskEntry prev; public TimerTaskEntry(TimerTask timedTask, long expireMs) { this.timerTask = timedTask; this.expireMs = expireMs; this.next = null; this.prev = null; } void remove() { TimerTaskList currentList = timedTaskList; while (currentList != null) { currentList.remove(this); currentList = timedTaskList; } } @Override public int compareTo(TimerTaskEntry o) { return ((int) (this.expireMs - o.expireMs)); }}

任務(wù)包裝類(lèi)(這里也可以將工作任務(wù)以線程變量的方式去傳入)

@Data@Slf4jclass TimerTask implements Runnable { /** * 延時(shí)時(shí)間 */ private long delayMs; /** * 任務(wù)所在的entry */ private TimerTaskEntry timerTaskEntry; private String desc; public TimerTask(String desc, long delayMs) { this.desc = desc; this.delayMs = delayMs; this.timerTaskEntry = null; } public synchronized void setTimerTaskEntry(TimerTaskEntry entry) { // 如果這個(gè)timetask已經(jīng)被一個(gè)已存在的TimerTaskEntry持有,先移除一個(gè) if (timerTaskEntry != null && timerTaskEntry != entry) { timerTaskEntry.remove(); } timerTaskEntry = entry; } public TimerTaskEntry getTimerTaskEntry() { return timerTaskEntry; } @Override public void run() { log.info('============={}任務(wù)執(zhí)行', desc); }}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99热国内精品| 亚洲综合日韩| 日本电影久久久| 日韩av一级片| 蜜桃久久久久| 日韩在线观看| 在线视频亚洲| 日本亚洲三级在线| 免费在线亚洲| 欧美.日韩.国产.一区.二区| 在线视频日韩| 国产精品**亚洲精品| а√在线中文在线新版| 欧美日韩激情| 亚洲欧美成人综合| 国产精品1区| 999国产精品| 亚洲+小说+欧美+激情+另类| 国产极品嫩模在线观看91精品| 特黄毛片在线观看| 亚洲色图国产| 成人污污视频| 香蕉视频成人在线观看| 国产精选一区| 欧美1区免费| 国产精品一区二区三区www| 色婷婷精品视频| 欧美在线看片| 在线成人动漫av| 四虎在线精品| 亚洲成人不卡| 欧美综合社区国产| 久久一区二区中文字幕| 日韩av中文字幕一区二区 | 国产精品专区免费| 亚洲精品1区| 国产精品第一| 久久99伊人| 不卡福利视频| 久久精品99久久久| 在线亚洲自拍| 91亚洲国产成人久久精品| 亚洲精品99| 精品国产三区在线| 日韩影片在线观看| 99久久视频| 国产精品亚洲综合色区韩国| 欧美不卡视频| 久久亚洲人体| 91欧美日韩在线| 国产一级久久| 久久精品电影| 国产成人精品一区二区三区免费| 亚洲精品免费观看| 精品中文一区| 蜜桃av在线播放| 欧美日韩1区2区3区| 伊人久久高清| 久久久精品区| 国产精品主播| 日韩精品亚洲专区在线观看| 亚洲高清av| 在线人成日本视频| 久久精品国产福利| 欧美影院视频| 亚洲精品激情| 在线免费观看亚洲| 日韩午夜一区| 99tv成人| 久久久久一区| 日韩精品诱惑一区?区三区| 国产经典一区| 日韩精品导航| 亚洲理论在线| 99在线精品免费视频九九视 | 国产精品对白久久久久粗| 日产欧产美韩系列久久99| 国产亚洲综合精品| 91九色精品国产一区二区| 国产日韩电影| 亚洲黄色网址| 日韩欧美午夜| 久久久精品五月天| 亚洲二区视频| 欧美日韩在线二区| 亚洲精品在线影院| 久久精品亚洲欧美日韩精品中文字幕| 日韩久久视频| 99久久九九| 不卡中文字幕| 国产精品美女| 日韩久久99| 国产亚洲精品精品国产亚洲综合| 日韩avvvv在线播放| 欧美亚洲三级| 精品欠久久久中文字幕加勒比| 精品少妇av| 日韩和的一区二在线| 精品中文一区| 免费成人在线视频观看| 一区二区三区午夜视频| 日韩专区视频网站| 国产精品一页| 伊人网在线播放| 99国产精品视频免费观看一公开 | 精品国产一级| 国产va免费精品观看精品视频| 国产高潮在线| 亚洲激情不卡| 蜜臀av国产精品久久久久| 日韩国产在线不卡视频| 久久av免费| 久久国产免费| 亚洲精品福利| 国产69精品久久| 在线国产一区| 日本午夜精品久久久久| 国产+成+人+亚洲欧洲在线| 91精品精品| 视频一区免费在线观看| 91精品国产自产精品男人的天堂 | 日韩视频免费| 亚洲区国产区| 精品国产成人| 亚洲激情黄色| 久久激情综合网| 日韩欧美午夜| 亚洲ww精品| 国产aⅴ精品一区二区三区久久 | 欧美成人基地 | 黄色成人精品网站| 日韩欧美中文字幕在线视频| 久久只有精品| 九色精品91| 国产精品日本一区二区三区在线 | 69堂免费精品视频在线播放| 高清日韩中文字幕| 国产亚洲精品自拍| 免费一区二区三区在线视频| 日韩一区自拍| 一级欧美视频| 日韩国产一区二区三区| 日本中文字幕一区二区视频| 国产 日韩 欧美 综合 一区| 在线视频免费在线观看一区二区| 国产日韩一区| 亚洲午夜在线| 国产精品亲子伦av一区二区三区| 免费成人网www| 麻豆视频一区| 国产一区二区高清| 久久精品国产在热久久| 狠狠爱成人网| 精品亚洲美女网站| 亚洲精品国产日韩| 亚洲特级毛片| 日产午夜精品一线二线三线| 日本不卡高清| 国产亚洲午夜| 亚洲啊v在线| 国产激情一区| 亚洲精品大全| 最新国产拍偷乱拍精品| 色综合五月天| 久久国产婷婷国产香蕉| 激情自拍一区| 国产精品久久久久久久免费观看 | 日本欧洲一区二区| 日韩在线看片| 精品国产精品国产偷麻豆| 日本综合视频| 久久亚洲不卡| 亚洲性图久久| 日韩免费福利视频| 麻豆91小视频| 久久国产人妖系列| 亚洲综合激情在线| 亚洲午夜电影| 日韩影院二区| 老司机精品视频在线播放| 日本天堂一区| 少妇高潮一区二区三区99| 99久久视频| 视频二区不卡| 日本不良网站在线观看| 久久三级中文| 欧美黄色精品| 国产乱子精品一区二区在线观看| 日本vs亚洲vs韩国一区三区二区| 亚洲激情婷婷| 99综合视频| 国产精品女主播一区二区三区| 国产中文一区| 亚洲va中文在线播放免费| 国产va在线视频| 天堂а√在线最新版中文在线| 成人在线免费观看91| 激情不卡一区二区三区视频在线| 国产精品流白浆在线观看| 国产精品久久久久久久久久妞妞|