日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java timertask 定时_Java定时任务--Timer和TimerTask

發(fā)布時(shí)間:2023/12/20 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java timertask 定时_Java定时任务--Timer和TimerTask 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.程序和編程

我們知道,計(jì)算機(jī)程序是一組計(jì)算機(jī)能識(shí)別和執(zhí)行的指令,運(yùn)行于電子計(jì)算機(jī)上,滿足人們某種需求的信息化工具。

簡單來說程序在本質(zhì)上是指令的集合,而編程從字面上來講就是編寫這些指令集合(程序),通過程序去完成某種行為。

在日常編程中,我們難免會(huì)遇到這種情況,如何在指定的時(shí)間去做某一件事情(比如鬧鐘響鈴)?在Java中通常使用定時(shí)任務(wù)去實(shí)現(xiàn),接下來會(huì)結(jié)合源碼分析Java中的定時(shí)任務(wù)。

2.從段子開始

上面是一個(gè)關(guān)于時(shí)間和線程的段子。當(dāng)然段子畢竟是為博眾人一笑,我們開發(fā)中獲取時(shí)間會(huì)有更好的方式。這里要說的是,如果我們要在下一天去做某個(gè)動(dòng)作(比如上面說的鬧鐘響鈴),

這種線程睡眠不失為一種簡單的方法(雖然我們通常不建議使用這種方式,更傾向使用定時(shí)任務(wù))。

3.Java定時(shí)任務(wù)

簡單的說Timer中有兩個(gè)核心部分:

TimerThread是時(shí)間線程,控制TaskQueue中TimerTask的執(zhí)行;

TaskQueue是一個(gè)工具類,管理TimerTask數(shù)組

而Timer暴露的主要是一系列schedule方法,去建立Timer和TimerTask的聯(lián)系。我們看到Java定時(shí)任務(wù)設(shè)計(jì)中很重要的部分就是定時(shí)器和任務(wù)的分離。

以上是簡單的示例,在使用定時(shí)任務(wù)時(shí)要注意幾點(diǎn):

一個(gè)Timer可以執(zhí)行多個(gè)TimerTask,但一個(gè)TimerTask只能被一個(gè)Timer使用(這和schedule中校驗(yàn)TimerTask的狀態(tài)有關(guān),TimerTask的生命周期(由不同的狀態(tài)確定))。

通常不使用匿名類創(chuàng)建TimerTask抽象類的子類,建議創(chuàng)建單獨(dú)的子類extend TimerTask。

根據(jù)實(shí)際需要采用不同的schedule方法或者scheduleAtFixedRate方法執(zhí)行任務(wù)。

合理使用cancel和purge方法。

4.源碼淺析

結(jié)合第3部分的簡單示例,來梳理源碼。

①創(chuàng)建Timer和TimerTask

Timer的核心構(gòu)造方法,調(diào)用此方法時(shí)啟動(dòng),初始化創(chuàng)建的TimerThread線程。

?

②執(zhí)行schedule或scheduleAtFixedRate方法

其中核心的sched方法,主要是判斷線程的狀態(tài),TimerTask的狀態(tài),然后將通過校驗(yàn)的TimerTask添加到TaskQueue,其后交由TimerThread管理。

③TimerThread原理

時(shí)間線程TimerThread中run方法執(zhí)行的mianLoop方法如上,會(huì)一直循環(huán)執(zhí)行。

a.獲取TaskQueue中的第一個(gè)序列的TimerTask(通過getMin()方法獲取),這里很重要,每次循環(huán)后TaskQueue序列可能會(huì)變化。

b.然后校驗(yàn)TimerTask的狀態(tài),移除TaskQueue不需要執(zhí)行的TimerTask

c.對(duì)于能夠執(zhí)行的TimerTask,校驗(yàn)當(dāng)前時(shí)間和執(zhí)行時(shí)間,?通過taskFired標(biāo)識(shí)(表示TimerTask是否就緒,可以執(zhí)行),(然后處理只執(zhí)行一次的,從TaskQueue中移除,按頻率執(zhí)行多次的重新排序,詳見rescheduleMin方法)。

d.未就緒的TimerTask將wait,而就緒(狀態(tài)正常且到執(zhí)行時(shí)間的TimerTask)的執(zhí)行TimerTask的run方法。此時(shí)該Timer中的TimerTask執(zhí)行完畢,后續(xù)的就是TimerTask線程邏輯。

④TaskQueue和TimerTask

結(jié)合源碼可以了解TaskQueue如何排序,以及TimerTask中不同的狀態(tài)(生命周期)的意義。

4.總結(jié)

Java原生的定時(shí)任務(wù)包括Timer和TimerTask兩部分,Timer為主,TimerTask為輔。

Timer中由TimerThread線程控制TimerTask是否執(zhí)行,Java通過這兩個(gè)類完成了定時(shí)任務(wù)的基本功能。

學(xué)習(xí)時(shí)不只是要學(xué)習(xí)其源碼中內(nèi)部實(shí)現(xiàn),工作原理。更要關(guān)注Timer和TimerTask分離的思想,這很重要。

后續(xù)學(xué)習(xí)Java中其他的定時(shí)任務(wù),如Spring的定時(shí)任務(wù),Quartz。

總結(jié)

以上是生活随笔為你收集整理的java timertask 定时_Java定时任务--Timer和TimerTask的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。