java 可超時(shí)的任務(wù)管理

問題

最近研究比特幣, 從網(wǎng)絡(luò)上下載區(qū)塊的時(shí)候有時(shí)候碰到一個(gè)問題: 比特幣的網(wǎng)絡(luò)的請(qǐng)求和響應(yīng)式是異步, 發(fā)送了一個(gè)請(qǐng)求無法判斷這個(gè)請(qǐng)求有沒有響應(yīng), 為了解決這個(gè)問題, 使用超時(shí)機(jī)制. 如果一起請(qǐng)求發(fā)起后, 一段時(shí)間沒有接受到響應(yīng), 就切換到另外一個(gè)服務(wù)器重新請(qǐng)求, 于是就實(shí)現(xiàn)了一個(gè)工具類 TimeoutTaskManager

實(shí)現(xiàn)說明

通過一個(gè)死循環(huán)的線程while (true) { ... }來監(jiān)聽超時(shí), 如果超時(shí)則切換到下一個(gè)服務(wù)器, 如果該線程被中斷會(huì)直接退出

執(zhí)行過程

假如有一個(gè)任務(wù)(Consumer<T> consumer), 有N臺(tái)服務(wù)器可以支持(public void addProvider(T provider) {), 當(dāng)前正在執(zhí)行的服務(wù)如果出現(xiàn)超時(shí)的時(shí)候(int time, TimeUnit unit), 自動(dòng)按照隊(duì)列(Queue<T> queue) 順序嘗試, 如果隊(duì)列里面沒有支持者則會(huì)一直等待 (waiting.await();), 直到 addProvider(T provider)的時(shí)候 waiting.signal()喚醒.

  1. 構(gòu)造函數(shù)指定 任務(wù)和超時(shí)時(shí)間
public TimeoutTaskManager(Consumer<T> consumer, int time, TimeUnit unit) { ... }
  1. 添加服務(wù)的提供者
public void addProvider(T provider) { ... }
  1. 移除提供者
public synchronized void remove(T e) { ... }
  1. 如果是指定的任務(wù)是 幾個(gè)任務(wù)的合集, 例如:集合中的任務(wù)耗時(shí)不同, 可以在完成一個(gè)任務(wù)后重置任務(wù)的超時(shí)時(shí)間, 所有的操作都必須是當(dāng)前的提供者才可以修改, 因此有個(gè)參數(shù) T me, 返回值判斷是否修改成功
public synchronized boolean touch(T me, long time, TimeUnit unit) { ... }

另外有個(gè)幾個(gè)簡單方法, 分別是默認(rèn)超時(shí)時(shí)間的10倍和20倍: touchTenFold, touchTwentyFold

  1. 有一個(gè)斷言方法認(rèn)定當(dāng)前是自己 assertIsMe, 如果不是自己會(huì)拋出 IllegalStateException 的異常
public TimeoutTaskManager<T> assertIsMe(T me, String format, Object... args) throws IllegalStateException { ... }

一些其他方法有用的方法

  1. 可以添加一個(gè)提供者切換時(shí)候的監(jiān)聽器, 有時(shí)候切換的時(shí)候需要做一些清理工作
public TimeoutTaskManager<T> addChangeListeners(BiConsumer<T, T> cn) { ... }
  1. 如果任務(wù)有共享數(shù)據(jù)可以放置到緩存中, 注意線程安全需要自己保證
public TimeoutTaskManager<T> putCache(String key, Object cache) { ... }
  1. 還提供了線程的同步的方法, 不會(huì)在 doing 的過程中產(chǎn)生 provider 的切換, 注意:不要產(chǎn)生死鎖
public synchronized TimeoutTaskManager<T> ifMe(T me, Runnable doing) throws IllegalStateException { ... }

詳細(xì)代碼在 Gitee TimeoutTaskManager

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末履羞,一起剝皮案震驚了整個(gè)濱河市本慕,隨后出現(xiàn)的幾起案子志衍,更是在濱河造成了極大的恐慌糟描,老刑警劉巖蛙奖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奖亚,死亡現(xiàn)場離奇詭異然眼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)顶籽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門玩般,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人礼饱,你說我怎么就攤上這事坏为。” “怎么了镊绪?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵匀伏,是天一觀的道長。 經(jīng)常有香客問我蝴韭,道長够颠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任榄鉴,我火速辦了婚禮摧找,結(jié)果婚禮上核行,老公的妹妹穿的比我還像新娘牢硅。我一直安慰自己蹬耘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布减余。 她就那樣靜靜地躺著综苔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪位岔。 梳的紋絲不亂的頭發(fā)上如筛,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音抒抬,去河邊找鬼杨刨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛擦剑,可吹牛的內(nèi)容都是我干的妖胀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惠勒,長吁一口氣:“原來是場噩夢啊……” “哼赚抡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纠屋,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤涂臣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后售担,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赁遗,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年族铆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岩四。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骑素,死狀恐怖炫乓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情献丑,我是刑警寧澤末捣,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站创橄,受9級(jí)特大地震影響箩做,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妥畏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一邦邦、第九天 我趴在偏房一處隱蔽的房頂上張望安吁。 院中可真熱鬧,春花似錦燃辖、人聲如沸鬼店。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妇智。三九已至,卻和暖如春氏身,著一層夾襖步出監(jiān)牢的瞬間巍棱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工蛋欣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留航徙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓陷虎,卻偏偏與公主長得像到踏,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泻红,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容