中文字幕 日本 在线 高清,精品久久久久久久久久久国产字幕,漂亮人妻洗澡被公强日日躁,西西4444wwww大胆视频

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

ScheduledThreadPoolExecutor是JDK5提供的可執(zhí)行定時(shí)任務(wù)的一個(gè)工具類(lèi),可以在多線程環(huán)境下延遲執(zhí)行任務(wù)或者定期執(zhí)行任務(wù);和Timer類(lèi)似,它也提供了三種定時(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)用戶(hù)自發(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)推薦

  • MKR和TOPC都屬于公司開(kāi)源節(jié)流項(xiàng)目管理平臺(tái)

    MKR和TOPC都屬于公司開(kāi)源節(jié)流項(xiàng)目管理平臺(tái) 開(kāi)源節(jié)流,是公司開(kāi)源節(jié)流項(xiàng)目管理平臺(tái)的一個(gè)重要目標(biāo)。在這個(gè)平臺(tái)上,公司可以集中管理和控制所有與開(kāi)源節(jié)流相關(guān)的項(xiàng)目,提高項(xiàng)目的效率和質(zhì)…

    科研百科 2024年10月16日
    1
  • “新基建”將改變什么(新基建將改變什么)

    來(lái)源:人民日?qǐng)?bào)海外版 2月20日,在浙江省杭州市富陽(yáng)區(qū)上官鄉(xiāng)芳村檢查點(diǎn),工作人員展示手機(jī)上的“疫情防控云圖”的實(shí)時(shí)數(shù)據(jù)。新華社記者 徐 昱攝 北京市海淀區(qū)的“城市大腦樣板間”。新華…

    科研百科 2023年6月27日
    219
  • “科技冬奧”重點(diǎn)專(zhuān)項(xiàng)2021年度項(xiàng)目申報(bào)指南發(fā)布 國(guó)撥經(jīng)費(fèi)總概算約0.83億元

    來(lái)源:長(zhǎng)城網(wǎng) 冰雪運(yùn)動(dòng)。 長(zhǎng)城網(wǎng)訊(記者 李代姣)近日,河北省科技廳轉(zhuǎn)發(fā)《科技部關(guān)于發(fā)布國(guó)家重點(diǎn)研發(fā)計(jì)劃“科技冬奧”重點(diǎn)專(zhuān)項(xiàng)2021年度項(xiàng)目申報(bào)指南的通知》。根據(jù)通知,2021年度…

    科研百科 2022年12月23日
    361
  • 合同管理編碼(合同管理編號(hào)方法)

    合同管理編號(hào)方法 合同管理是組織管理合同的重要方式之一,合同管理編號(hào)方法則是合同管理中非常重要的一環(huán)。在合同管理編號(hào)方法中,需要明確合同編號(hào)的含義、使用規(guī)則和編號(hào)規(guī)則,以確保合同編…

    科研百科 2024年6月5日
    40
  • saas app(saas管理軟件)

    saas管理軟件:企業(yè)數(shù)字化的得力助手 隨著數(shù)字化時(shí)代的到來(lái),企業(yè)對(duì)于管理軟件的需求也越來(lái)越多樣化。傳統(tǒng)的桌面軟件已經(jīng)無(wú)法滿(mǎn)足現(xiàn)代企業(yè)的需求,而SaaS管理軟件成為了現(xiàn)代企業(yè)數(shù)字化…

    科研百科 2024年6月2日
    35
  • 系統(tǒng)集成項(xiàng)目人力管理

    系統(tǒng)集成項(xiàng)目人力管理 系統(tǒng)集成項(xiàng)目是一個(gè)龐大而復(fù)雜的工程,需要涉及到多個(gè)部門(mén)和人員之間的協(xié)作。在系統(tǒng)集成項(xiàng)目中,人力資源管理是至關(guān)重要的,因?yàn)樗苯佑绊戫?xiàng)目的進(jìn)展和成果。本文將探討…

    科研百科 2025年1月18日
    7
  • 常德芷蘭街道嚴(yán)把黨員素質(zhì)關(guān) 入黨先面試

    面試會(huì)現(xiàn)場(chǎng)。 紅網(wǎng)時(shí)刻常德6月4日訊(記者 白玲川 通訊員 任鳳杰)為加強(qiáng)街道黨員隊(duì)伍建設(shè),提高街道入黨積極分子及黨員發(fā)展對(duì)象的素質(zhì)和服務(wù)水平,展示新時(shí)期黨員風(fēng)采,6月4日上午,常…

    科研百科 2023年2月6日
    310
  • 科研項(xiàng)目會(huì)務(wù)費(fèi)

    科研項(xiàng)目會(huì)務(wù)費(fèi) 科研項(xiàng)目會(huì)務(wù)費(fèi)是指為支持科研項(xiàng)目的開(kāi)展,學(xué)術(shù)會(huì)議、研討會(huì)、技術(shù)交流等活動(dòng)所應(yīng)支付的款項(xiàng)。隨著科技的發(fā)展,科研項(xiàng)目之間的交流越來(lái)越頻繁,科研項(xiàng)目會(huì)務(wù)費(fèi)也逐漸成為科研項(xiàng)…

    科研百科 2025年3月23日
    6
  • it合同管理

    IT合同管理 隨著信息技術(shù)的不斷發(fā)展,IT合同管理已經(jīng)成為企業(yè)合同管理中不可或缺的一部分。IT合同管理不僅可以幫助企業(yè)有效地管理合同,還可以提高合同執(zhí)行效率,降低風(fēng)險(xiǎn),并為企業(yè)帶來(lái)…

  • 合同okr

    合同OkR: 合同的履行與優(yōu)化 隨著數(shù)字化時(shí)代的到來(lái),合同已經(jīng)成為了人們?nèi)粘I钪胁豢苫蛉钡囊徊糠?。然而,合同的履行與優(yōu)化也成為了一個(gè)備受挑戰(zhàn)的問(wèn)題。為了更好地解決這一問(wèn)題,本文將…

    科研百科 2024年12月5日
    2