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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )

發布時間:2025/6/17 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、Timer 定時器基本使用
  • 二、Timer 定時器常用用法
  • 三、Timer 源碼分析
  • 四、Timer 部分源碼注釋
  • 五、源碼及資源下載



參考文檔 :

  • Timer 定時器 API 文檔
  • TimerTask 定時器任務 API 文檔




一、Timer 定時器基本使用



Timer 可用于執行延遲任務或循環任務 ; 下面是定時器最基本用法 ;


1 . Timer 定時器基本使用 :

  • 創建 Timer 定時器 : 調用構造函數創建定時器 Timer timer = new Timer() ;
  • 分配 TimerTask 定時器任務 : 調用定時器的 schedule 方法 , 為 Timer 定時器分配 TimerTask 定時器任務 ;
timer.schedule(new TimerTask() {@Overridepublic void run() {// ...}}, 1_000);

2 . 定時器任務執行規則 : Timer 執行任務是 串行執行 的 , 同一時間只能執行一個任務 ;

在下面的示例中

  • 任務 1 在 1 秒之后執行 , 在第 6 秒執行完畢 ;
  • 任務 2 在第 6 秒 , 任務 1 執行完畢后 , 才開始執行 , 在第 11 秒執行完畢 ;

3 . 代碼示例 :

private void timer(){// Timer 可用于執行延遲任務或循環任務Timer timer = new Timer();/*如果提交多個 TimerTask 定時器任務需要等待之前的 定時器任務 執行完成 , 才能執行后面的任務TimerTask 實現了 Runnable 接口延遲 1 秒執行任務 1 ( 任務 1 時長 5 秒 )延遲 2 秒執行任務 2 ( 任務 2 時長 5 秒 )Timer 執行任務是串行執行的 , 同一時間只能執行一個任務任務 1 在 1 秒之后執行 , 在第 6 秒執行完畢任務 2 在第 6 秒 , 任務 1 執行完畢后 , 才開始執行 , 在第 11 秒執行完畢*/// 延遲 1 秒執行任務 1timer.schedule(new TimerTask() {@Overridepublic void run() {Log.i(TAG, "延遲 1 秒執行 5 秒的任務 1 開始執行");try {Thread.sleep(5_000);} catch (InterruptedException e) {e.printStackTrace();}Log.i(TAG, "延遲 1 秒執行 5 秒的任務 1 執行完畢");}}, 1_000);// 延遲 2 秒執行任務 2timer.schedule(new TimerTask() {@Overridepublic void run() {Log.i(TAG, "延遲 2 秒執行 5 秒的任務 2 開始執行");try {Thread.sleep(5_000);} catch (InterruptedException e) {e.printStackTrace();}Log.i(TAG, "延遲 2 秒執行 5 秒的任務 2執行完畢");}}, 2_000);}



二、Timer 定時器常用用法



1 . Timer 定時器構造函數 :


① 創建默認定時器 : 默認以 “Timer-序列號” 作為定時器線程名稱 ;

public Timer() { this("Timer-" + serialNumber()); }

② 創建守護線程定時器 : 指定定時器是否作為守護線程來執行 , 定時器線程名稱是默認名稱 ;

public Timer(boolean isDaemon) { this("Timer-" + serialNumber(), isDaemon); }

③ 創建定時器并指定定時器名稱 : 創建定時器 , 并 設置定時器線程名稱 ;

public Timer(String name) {thread.setName(name);thread.start();}

④ 指定名稱并設置守護線程 : 同時 設置定時器名稱 , 并 設置定時器是否是守護線程 ;

public Timer(String name, boolean isDaemon) {thread.setName(name);thread.setDaemon(isDaemon);thread.start();}

2 . 定時器調度方法 :


① 在指定一段時間后執行定時器任務 : 在 delay 毫秒后 , 執行 TimerTask 定時器任務 ;

public void schedule(TimerTask task, long delay) {if (delay < 0)throw new IllegalArgumentException("Negative delay.");sched(task, System.currentTimeMillis()+delay, 0);}

② 在指定的時間執行定時器任務 : 在某個指定的時間執行 TimerTask 定時器任務 ;

public void schedule(TimerTask task, Date time) { sched(task, time.getTime(), 0); }

③ 在指定的時間執行循環任務 : 在 firstTime 時間執行第一次 TimerTask 定時器任務 , 之后每隔 period 毫秒的周期時間 , 循環執行定時器任務 ; 循環周期是 period 毫秒 ; 如果因為某種原因導致某些操作出現了延遲 , 那么后續操作也會跟著延遲 ;

public void schedule(TimerTask task, Date firstTime, long period) {if (period <= 0)throw new IllegalArgumentException("Non-positive period.");sched(task, firstTime.getTime(), -period);}

④ 延遲指定時間循環執行任務 : 延遲 delay 毫秒后 , 執行第一次定時器任務 , 然后每隔 period 毫秒 , 循環執行定時器任務 ; 循環周期是 period 毫秒 ; 如果因為某種原因導致某些操作出現了延遲 , 那么后續操作也會跟著延遲 ;

public void schedule(TimerTask task, long delay, long period) {if (delay < 0)throw new IllegalArgumentException("Negative delay.");if (period <= 0)throw new IllegalArgumentException("Non-positive period.");sched(task, System.currentTimeMillis()+delay, -period);}

⑤ 在指定的時間執行循環任務 : 在 firstTime 時間執行第一次 TimerTask 定時器任務 , 之后每隔 period 毫秒的周期時間 , 循環執行定時器任務 ; 循環周期是 period 毫秒 ; 如果因為某種原因導致某些操作出現了延遲 , 那么后續操作需要補償上述出現的延遲 ;

public void scheduleAtFixedRate(TimerTask task, long delay, long period) {if (delay < 0)throw new IllegalArgumentException("Negative delay.");if (period <= 0)throw new IllegalArgumentException("Non-positive period.");sched(task, System.currentTimeMillis()+delay, period);}

⑥ 延遲指定時間循環執行任務 : 延遲 delay 毫秒后 , 執行第一次定時器任務 , 然后每隔 period 毫秒 , 循環執行定時器任務 ; 循環周期是 period 毫秒 ; 如果因為某種原因導致某些操作出現了延遲 , 那么后續操作需要補償上述出現的延遲 ;

public void scheduleAtFixedRate(TimerTask task, Date firstTime,long period) {if (period <= 0)throw new IllegalArgumentException("Non-positive period.");sched(task, firstTime.getTime(), period);}

schedule 方法適用場景 : 適合用于平穩執行某種任務 ; 穩定性 > 準確率 ;

scheduleAtFixedRate 方法適用場景 : 適合用于對絕對時間敏感的任務 ; 準確率 > 穩定性 ;





三、Timer 源碼分析



在 Timer 中定義了 TimerThread thread 成員變量 , 該成員對象在創建對象時會自動創建 ;

TimerThread 是定義在 Timer.java 文件中的類 , 是一個自定義線程類 ; 該幫助類實現了定時器任務的執行線程 , 該線程中的定時器隊列等待任務到來 , 在合適的時間執行定時器任務 ; 調度需要重復執行的任務 ; 從任務隊列中 , 移出被取消的任務 , 移出不需要循環執行的任務 ;

class TimerThread extends Thread{}

在構造函數 public Timer(String name) 中 , 調用了該線程的 start() 方法 , 啟動了該線程 ;

// 省略了無關代碼 public class Timer {private final TimerThread thread = new TimerThread(queue);public Timer(String name) {// 啟動 TimerThread 線程 thread.start();} }

在 TimerThread 自定義線程中的 run() 方法中 , 主要是調用了 mainLoop() 方法 ; 該方法中是一個死循環 , 從循環隊列中取出 TimerTask 定時器任務 , 然后執行 ; 必須等待前一個任務執行完畢 , 才能執行下一個任務 ;






四、Timer 部分源碼注釋



// 省略了無關代碼 public class Timer {/*** 定時器線程 * 該 TimerThread thread 對象在創建對象時會自動創建 */// Android-added: @ReachabilitySensitive@ReachabilitySensitiveprivate final TimerThread thread = new TimerThread(queue);// 生成序列號 , 作為定時器線程的默認名稱 private static int serialNumber() {return nextSerialNumber.getAndIncrement();}/*** 創建默認定時器 , TimerThread thread 成員變量不作為守護線程*/public Timer() {this("Timer-" + serialNumber());}/*** 創建一個定時器 , 其關聯的 TimerThread thread 成員可以設置是否作為守護線程 ;* 如果該定時器用于用于調度重復性的維護活動 , 其守護線程會被調用 , * 應用運行期間必須調用守護線程 , * 但是上述操作不能影響應用的生命周期 ; ** @param isDaemon 如果設置成 true , TimerThread thread 需要被設置成守護線程 */public Timer(boolean isDaemon) {this("Timer-" + serialNumber(), isDaemon);}/*** 創建一個 Timer 定時器 , 并為其其關聯的線程設置指定的名稱 ; ** @param name 為 TimerThread 成員變量設置名稱*/public Timer(String name) {thread.setName(name);// 啟動 TimerThread 線程 thread.start();}/*** Creates a new timer whose associated thread has the specified name,* and may be specified to* {@linkplain Thread#setDaemon run as a daemon}.** @param name 設置關聯的定時器線程名稱* @param isDaemon 如果設置成 true 定時器線程將被設置成守護線程*/public Timer(String name, boolean isDaemon) {thread.setName(name);thread.setDaemon(isDaemon);thread.start();}}/*** TimerThread 是定義在 Timer.java 文件中的類 ; * * 該幫助類實現了定時器任務的執行線程 , 該線程中的定時器隊列等待任務到來 , 在合適的時間執行定時器任務 ; * 調度需要重復執行的任務 ;* 從任務隊列中 , 移出被取消的任務 , 移出不需要循環執行的任務 ; */ class TimerThread extends Thread {/*** 該標志為會 被 reaper 設置成 false , 用于通知我們定時器對象已經被銷毀 ; * 一旦該標志位設置成 true , 并且任務隊列中沒有任務時 , 沒有任務去執行 , 這里就需要優雅的關閉定時器 ; * 注意該字段由隊列管理器維護 ; */boolean newTasksMayBeScheduled = true;/*** 任務隊列 , 調用 schedule 方法調度 TimerTask 定時器任務 , 就是將任務加入到該隊列中 ; * 定時器任務隊列 , 在定時器線程中維護該隊列 , 而不是在定時器中維護 , 這樣避免循環引用 ; * 否則定時器永遠不會被回收 , 并且該線程永遠不會消失 ; */private TaskQueue queue;TimerThread(TaskQueue queue) {this.queue = queue;}// run 方法中主要是調用 mainLoop() 方法 ; public void run() {try {mainLoop();} finally {// 如果定時器被取消 , 需要殺死該線程synchronized(queue) {newTasksMayBeScheduled = false;queue.clear(); // 消除過時的引用}}}/*** 定時器輪詢 * 里面是一個死循環 , 循環從人物隊列中取出 TimerTask 定時器任務 , 然后執行 ; * 必須等待前一個任務執行完畢 , 才能執行下一個任務 */private void mainLoop() {while (true) {try {TimerTask task; // 定時器任務 boolean taskFired; synchronized(queue) {// 如果隊列為空 , 一直阻塞 , 當有任務進來時 , 解除阻塞while (queue.isEmpty() && newTasksMayBeScheduled)queue.wait();if (queue.isEmpty())break; // 如果隊列為空 , 就會退出循環 , 終止該定時器 // 隊列不為空 , 查看第一個 evt , 并執行相應操作 long currentTime, executionTime;task = queue.getMin();synchronized(task.lock) {if (task.state == TimerTask.CANCELLED) {queue.removeMin();continue; // 任務被取消 , 從隊列中移除}currentTime = System.currentTimeMillis();executionTime = task.nextExecutionTime;if (taskFired = (executionTime<=currentTime)) {if (task.period == 0) { // 該任務不需要循環執行 , 從隊列中移除 queue.removeMin();task.state = TimerTask.EXECUTED;} else { // 該任務需要循環執行 , 繼續調度queue.rescheduleMin(task.period<0 ? currentTime - task.period: executionTime + task.period);}}}if (!taskFired) // 等待前一個任務執行完畢 , 如果之前的任務沒有執行完畢 , 一直阻塞queue.wait(executionTime - currentTime);}if (taskFired) // 任務執行完畢task.run();} catch(InterruptedException e) {}}} }



五、源碼及資源下載



源碼及資源下載地址 :

  • ① GitHub 工程地址 : Android_Asynchronous

  • ② MainActivity.java 主界面代碼地址 : MainActivity.java , 這是上述示例代碼位置 ; 僅做參考意義不大 ;

總結

以上是生活随笔為你收集整理的【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中国大陆一级片 | 性xxxx狂欢老少配o | 日本公妇乱淫免费视频一区三区 | 免费观看成年人视频 | 少妇高潮一区二区三区99 | 日韩av女优在线观看 | 性高潮久久久久久久 | 国产一级自拍视频 | 亚洲男人第一天堂 | 少妇做爰免费理伦电影 | 国产三级三级在线观看 | 国产日韩一区二区三区 | 国产懂色av | 亚洲午夜精品久久久久久浪潮 | 韩国三级在线视频 | 性色欲网站人妻丰满中文久久不卡 | 日韩播放 | 精品视频在线播放 | 久久黄色大片 | 尤物视频在线观看国产 | 国产女18毛片多18精品 | 国产欧美日韩综合 | 日本在线观看一区二区三区 | 成人看片 | 一区二区日韩欧美 | 麻豆亚洲av成人无码久久精品 | 哈利波特3在线观看免费版英文版 | 黄片毛片一级 | 欧美人与性动交α欧美片 | 亚洲国产影视 | 黄色小视频在线观看 | 亚洲第一页在线 | 国产午夜精品在线观看 | 久久视奸| 日本裸体视频 | 成人看片网 | 男女做事网站 | japanese国产在线| 欧美精品久久99 | 亚洲欧美日韩成人在线 | 日韩一区二区三区在线观看视频 | 久久只有精品 | 麻豆传媒网站 | 午夜在线观看影院 | 欧美日韩a√ | 亚洲美女视频在线 | 男人与雌性宠物交啪啪 | 国内精品久久久久久久 | 色av一区二区三区 | 欧美日韩有码 | 中国一级大黄大黄大色毛片 | 视频一区日韩 | www国产无套内射com | 欧美成人精品一区二区综合免费 | 久久88 | 亚洲在线观看一区 | 日本黄色生活片 | 男女污污软件 | 伊人操 | 亚洲一区二区视频在线观看 | 黑丝国产一区 | 极品人妻一区二区 | 九九九久久久 | 天降女子在线观看 | 激情综合网婷婷 | 大香蕉视频一区二区 | 99在线精品视频免费观看20 | 日本东京热一区二区三区 | 大肉大捧一进一出好爽mba | 不卡在线 | 免费成人看视频 | 欧美亚洲久久 | 黄色小电影网址 | 性做久久久久久久久 | 黄色大片在线 | 高潮白浆女日韩av免费看 | 8x8ⅹ8成人免费视频观看 | 亚洲午夜在线播放 | 97超碰碰 | 精品九九久久 | 日韩欧美精品在线观看 | 日本一区二区三区久久 | 黄色大片免费观看视频 | 黄色网在线免费观看 | 国产女人高潮时对白 | 国产精品久久久久久久久久妞妞 | 国产美女一级片 | 亚洲一区二区免费视频 | 神马午夜在线 | 国产精品久久久久久久免费看 | 一区二区在线免费观看视频 | 日韩成人免费在线视频 | 国产亚洲精品久久久 | 精品少妇一区二区三区 | 欧美夜夜夜 | 日韩熟女精品一区二区三区 | 中国丰满人妻videoshd | 国产传媒视频在线观看 | 男人爱看的网站 |