丁香五月亚洲,欧美孕妇XXX高清在线,国产中文资源,精品r视频在线

Java定時(shí)任務(wù)之ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor是JDK5提供的可執(zhí)行定時(shí)任務(wù)的一個(gè)工具類,可以在多線程環(huán)境下延遲執(zhí)行任務(wù)或者定期執(zhí)行任務(wù);和Timer類似,它也提供了三種定時(shí)模式:

  1. 延遲執(zhí)行任務(wù)
  2. 固定延遲的定期執(zhí)行(fixed delay)
  3. 按照固定的周期執(zhí)行(fixed rate)

延遲執(zhí)行任務(wù)

任務(wù)將按照給定的時(shí)間延遲delay后開(kāi)始執(zhí)行;對(duì)應(yīng)的方法如下:

schedule(Runnable command, long delay, TimeUnit unit)  schedule(Callable<V> callable, long delay, TimeUnit unit)  

下面我們通過(guò)一個(gè)例子檢驗(yàn)下結(jié)果是否正確:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); PrintUtil.print("start schedule a task."); executor.schedule(new Runnable() { @Override public void run() { PrintUtil.print("task is running."); }}, 5, TimeUnit.SECONDS);

我們計(jì)劃了一個(gè)5秒鐘后執(zhí)行的任務(wù),通過(guò)打印結(jié)果可以看到確實(shí)按照給定時(shí)間執(zhí)行了:

15:44:07--start schedule a task.15:44:12--task is running.

固定延遲的定期執(zhí)行

任務(wù)第一次按照給定的初始延遲initialDelay執(zhí)行,后續(xù)每一次執(zhí)行的時(shí)間為上一次任務(wù)的結(jié)束時(shí)間加上給定的period后執(zhí)行;對(duì)應(yīng)的方法如下:

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

同樣我們通過(guò)一個(gè)例子檢驗(yàn)下結(jié)果是否正確:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); PrintUtil.print("start schedule a task."); executor.scheduleWithFixedDelay(new Runnable() { @Override public void run() { PrintUtil.print("task is running."); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }}, 0, 5, TimeUnit.SECONDS);

我們計(jì)劃了一個(gè)定期(每5秒鐘)延遲執(zhí)行的任務(wù),第一次任務(wù)立即執(zhí)行,每次任務(wù)執(zhí)行時(shí)長(zhǎng)2秒鐘,通過(guò)打印的日志我們可以看到每次任務(wù)開(kāi)始執(zhí)行的時(shí)間為:上次任務(wù)結(jié)束時(shí)間 5秒鐘:

15:55:16--start schedule a task.15:55:16--task is running.15:55:18--task is finished.15:55:23--task is running.15:55:25--task is finished.15:55:30--task is running.15:55:32--task is finished.

按照固定的周期執(zhí)行

任務(wù)第一次按照給定的初始延遲initialDelay執(zhí)行,后續(xù)每一次執(zhí)行的時(shí)間為固定的時(shí)間間隔period,如果線程池中工作線程不夠則任務(wù)順延執(zhí)行;對(duì)應(yīng)的方法如下:

scheduleWithFixedDelay(Runnable command, long initialDelay, long period, TimeUnit unit)

同樣我們通過(guò)一個(gè)例子檢驗(yàn)下結(jié)果是否正確:

ScheduledExecutorService executor = Executors.newScheduledThreadPool(10); PrintUtil.print("start schedule a task."); executor.scheduleAtFixedRate(new Runnable() { @Override public void run() { PrintUtil.print("task is running."); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } PrintUtil.print("task is finished."); }}, 0, 5, TimeUnit.SECONDS);

我們創(chuàng)建了一個(gè)核心線程池為10的ScheduledThreadPoolExecutor,并計(jì)劃了一個(gè)定期(每5秒鐘)執(zhí)行一次的任務(wù),過(guò)打印的日志我們可以看到每次任務(wù)開(kāi)始執(zhí)行的時(shí)間為:上次任務(wù)開(kāi)始時(shí)間 5秒鐘:

16:02:43--start schedule a task.16:02:43--task is running.16:02:45--task is finished.16:02:48--task is running.16:02:50--task is finished.

上面的例子都是計(jì)劃了一個(gè)任務(wù),如果是有多個(gè)定時(shí)任務(wù)同時(shí)執(zhí)行會(huì)怎么樣呢?

如果線程足夠并且CPU資源足夠,那就會(huì)同時(shí)執(zhí)行,如果線程或者CPU資源不夠那只能排隊(duì)執(zhí)行了。有興趣的話可以克隆文末的測(cè)試代碼,里面提供了一些測(cè)試的例子。

底層原理

ScheduledThreadPoolExecutor是如何保證我們計(jì)劃的任務(wù)都是按照正確的時(shí)間點(diǎn)執(zhí)行的呢?

其內(nèi)部實(shí)現(xiàn)了一個(gè)阻塞隊(duì)列DelayedWorkQueue,所有的任務(wù)都會(huì)放到這個(gè)隊(duì)列里。這個(gè)阻塞隊(duì)列內(nèi)部通過(guò)一個(gè)數(shù)組來(lái)保存這些任務(wù),并且基于最小堆排序,按照每個(gè)任務(wù)的下次執(zhí)行時(shí)間進(jìn)行排序,這樣就保證了執(zhí)行線程拿到的這個(gè)隊(duì)列中的第一個(gè)元素就是最接近當(dāng)前時(shí)間執(zhí)行的任務(wù)了。

相關(guān)的源碼如下:

// 保存定時(shí)任務(wù)的隊(duì)列private RunnableScheduledFuture<?>[] queue = new RunnableScheduledFuture<?>[INITIAL_CAPACITY];// 最小堆排序相關(guān)的方法private void siftUp(int k, RunnableScheduledFuture<?> key)private void siftDown(int k, RunnableScheduledFuture<?> key)


那時(shí)間上是如何保證的呢?

DelayedWorkQueue重寫(xiě)了take和poll方法,利用了AQS的ConditionObject機(jī)制使當(dāng)前線程休眠,等時(shí)間到了再喚醒線程去拿第一個(gè)任務(wù)。

關(guān)于AQS和ConditonObject的介紹,可以參考下文末的鏈接。

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(); }}

優(yōu)點(diǎn)

作為對(duì)JDK1.3推出的Timer的替代,ScheduledThreadPoolExecutor有如下優(yōu)點(diǎn):

  1. 它支持多個(gè)定時(shí)任務(wù)同時(shí)執(zhí)行,而Timer是單線程執(zhí)行的
  2. 它通過(guò)System.nanoTime()保證了任務(wù)執(zhí)行時(shí)間不受操作系統(tǒng)時(shí)間變化的影響
  3. 一個(gè)定時(shí)任務(wù)拋出異常,其他定時(shí)任務(wù)不受影響,而Timer卻不支持這一點(diǎn)

Demo代碼

src/main/java/net/weichitech/util/ScheduledThreadPoolExecutorDemo.java · 小西學(xué)編程/java-learning – Gitee.com

參考文章

Java定時(shí)任務(wù)之Timer原理解析

JAVA并發(fā)之ReentrantLock原理解析

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。

(0)
上一篇 2022年12月11日 上午10:36
下一篇 2022年12月11日 上午10:50

相關(guān)推薦

  • 黨建管理平臺(tái)讓組織生活“可視化”(黨建管理app)

    傳統(tǒng)黨建活動(dòng)空間僅局限于部門(mén)、層級(jí)、單位、同一地域,信息共享、資源共享成為進(jìn)一步發(fā)展的瓶頸制約。而通過(guò)信息化的手段,這些問(wèn)題都將迎刃而解。黨建管理平臺(tái)通過(guò)網(wǎng)絡(luò)技術(shù)的應(yīng)用,打造網(wǎng)上黨…

    科研百科 2023年2月26日
    306
  • 科研項(xiàng)目技術(shù)檔案管理辦法科研項(xiàng)目技術(shù)檔案管理辦法

    科研項(xiàng)目技術(shù)檔案管理辦法 為加強(qiáng)科研項(xiàng)目的技術(shù)管理,規(guī)范科研項(xiàng)目的技術(shù)檔案管理,提高科研項(xiàng)目的質(zhì)量和效率,根據(jù)《中華人民共和國(guó)科學(xué)技術(shù)法》等相關(guān)法律法規(guī),制定本項(xiàng)目技術(shù)檔案管理辦法…

    科研百科 2024年9月8日
    6
  • 管理的項(xiàng)目系統(tǒng)

    管理的項(xiàng)目系統(tǒng)是一種工具,可以幫助管理人員對(duì)項(xiàng)目進(jìn)行更好的管理和監(jiān)控。它可以幫助管理人員更好地跟蹤項(xiàng)目的進(jìn)度, 預(yù)算, 和質(zhì)量, 并且可以提供更實(shí)時(shí)的反饋和建議。本文將介紹如何有效…

    科研百科 2024年10月3日
    0
  • 祥云大項(xiàng)目管理系統(tǒng)

    祥云大項(xiàng)目管理系統(tǒng) 祥云大項(xiàng)目管理系統(tǒng)是一款功能強(qiáng)大、易于使用的軟件,可以幫助企業(yè)更好地管理大型項(xiàng)目。該系統(tǒng)涵蓋了項(xiàng)目管理的各個(gè)方面,包括項(xiàng)目計(jì)劃、進(jìn)度跟蹤、成本管理、質(zhì)量管理、風(fēng)…

    科研百科 2025年1月17日
    1
  • 省唄App:假相親男的真性情,這個(gè)妹控令人敬佩(省唄真的假的)

    在閱讀此文之前,麻煩您點(diǎn)擊一下“關(guān)注”,既方便您進(jìn)行討論和分享,還可以給您帶來(lái)不一樣的參與感,謝謝您的支持。 “女子賢惠,你應(yīng)該辭去工作,住到我家便于孝順我的父母,勤快地洗衣做飯!…

    科研百科 2024年5月11日
    43
  • wms倉(cāng)儲(chǔ)管理系統(tǒng)軟件定制

    wms倉(cāng)儲(chǔ)管理系統(tǒng)軟件定制:提高倉(cāng)儲(chǔ)管理效率 倉(cāng)儲(chǔ)管理系統(tǒng)(Warehouse Management System,簡(jiǎn)稱wms)是一種用于管理倉(cāng)庫(kù)庫(kù)存和物流的軟件系統(tǒng)。wms系統(tǒng)可…

    科研百科 2024年9月30日
    3
  • 中國(guó)發(fā)動(dòng)力研究所

    中國(guó)發(fā)動(dòng)力研究所是中國(guó)科學(xué)技術(shù)部直屬的研究機(jī)構(gòu)之一,成立于1958年,致力于可再生能源的研究和應(yīng)用。研究所的主要研究領(lǐng)域包括太陽(yáng)能、風(fēng)能、水能、地?zé)崮艿瓤稍偕茉吹陌l(fā)電技術(shù)、電池技…

    科研百科 2024年11月12日
    0
  • 我們常聽(tīng)到的 Web 3,究竟是什么?(web3.0是什么意思)

    編輯導(dǎo)語(yǔ):隨著互聯(lián)網(wǎng)時(shí)代的發(fā)展,我們經(jīng)常會(huì)聽(tīng)到Web 3這個(gè)術(shù)語(yǔ),那么Web 3究竟是什么呢?Web 3與元宇宙、加密貨幣等這些概念之間又有什么聯(lián)系呢?本篇文章作者為你解答,講述了…

    科研百科 2022年10月23日
    313
  • 軟件項(xiàng)目管理系統(tǒng)開(kāi)源

    軟件項(xiàng)目管理系統(tǒng)開(kāi)源:讓開(kāi)源項(xiàng)目更好地管理 隨著軟件開(kāi)發(fā)行業(yè)的不斷增長(zhǎng),軟件項(xiàng)目管理系統(tǒng)的需求也在不斷增加。然而,目前市面上的軟件項(xiàng)目管理系統(tǒng)大多存在功能單一、管理不便、難以自定義…

    科研百科 2024年12月18日
    2
  • 工程項(xiàng)目管理信息系統(tǒng)

    工程項(xiàng)目管理信息系統(tǒng) 隨著信息技術(shù)的不斷發(fā)展,工程項(xiàng)目管理信息系統(tǒng)已經(jīng)成為現(xiàn)代項(xiàng)目管理中不可或缺的一部分。該系統(tǒng)可以幫助項(xiàng)目經(jīng)理和項(xiàng)目團(tuán)隊(duì)更好地管理項(xiàng)目進(jìn)度、資源、質(zhì)量和成本,提高…

    科研百科 2024年7月24日
    3
日韩色综合网站| 中文字幕在线观看网站| 中文字幕无码不卡一区二区三区| 护士无码不卡| 亚洲成人电影一区二区三区| 丰满熟妇岳av| 久久国产精品只做精品| 一区二区久久久国产| 天天插天天射久久| 亚洲精品欧美精品| 久久久久久久波多野结衣| 极品尤物Av| 波多野结衣无码潮喷视频| 午夜视频网址| 性欧美老妇乱码一区二区| 1024金沙人妻一区二区三区| 91视频久久久久久久久久久| 搜索一级大黄片| 麻豆 videos| 亚洲国产无码专区| 丝袜二区| 国产大热在线| 久久九九免费国产精品街| 国内自产视频精品区| 久久总合88| 精品国产免费一区二区三区香蕉| 精品免费在线观看| 人妻少妇中文字幕乱码免费| 囯产精品久久久久久久久久小说| 三级免费无码| 国产AV一区二区精品久久动漫| 日韩一本无码不卡| 午夜亚洲人人精品一区| 人人操人人干人人操人人干人人 | 自慰无码免费一区二区三区9| 欧美日韩另类国产亚洲| 无码高清视| 国产精品美女乱子伦高潮| 99在线观看视频| 亚洲一级内射涩爱av| 国产99一区二区三区|