最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中的Timer和Timertask的關系解讀

 更新時間:2024年12月23日 17:17:00   作者:健康平安的活著  
本文詳細介紹了Java中的Timer和TimerTask類,包括它們之間的關系、API的使用方法、注意事項以及操作案例,Timer是一個調度器,而TimerTask是具體的任務類,Timer僅對應一個線程,不保證任務執(zhí)行的精確性,但線程安全,一個Timer可以調度多個TimerTask

一 time和timertask的關系

1.1 timer和timertask關系

1.Timer來講就是一個調度器,而TimerTask呢只是一個實現(xiàn)了run方法的一個類;

2.Timer和TimerTask成對出現(xiàn),Timer是定時器,TimerTask是定時任務。換句話說,定時任務TimerTask是給定時器Timer執(zhí)行的具體任務。TimerTask實現(xiàn)Runnable接口的run方法。

Java的定時器Timer和定時任務TimerTask應用以及原理

3.每一個Timer僅對應唯一一個線程。Timer不保證任務執(zhí)行的十分精確。Timer類的線程安全的。

4.一個Timer可以調度任意多個TimerTask,所有任務都存儲在一個隊列中順序執(zhí)行,如果需要多個TimerTask并發(fā)執(zhí)行,則需要創(chuàng)建兩個多個Timer。

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

簡單的說Timer中有兩個核心部分:

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

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

1.2 timer的api

無參構造方法,簡單通過Tiemer為前綴構造一個線程名稱

有參構造方法,傳入了是否為后臺線程,后臺線程當且僅當進程結束時,自動注銷掉。

1.3 終止Timer線程

默認情況下,創(chuàng)建的timer線程會一直執(zhí)行,主要有下面四種方式來終止timer線程:

1) 調用Timer.cancle()方法。可以在程序任何地方調用,甚至在TimerTask中的run方法中調用;

2) 創(chuàng)建Timer時定義位daemon守護線程,使用new Timer(true)語句;

3) 設置Timer對象為null,其會自動終止;????有待考證

4) 調用System.exit方法,整個程序終止。

1.4 timer注意事項

1) Timer線程不會捕獲異常,所以TimerTask拋出的未檢查的異常會終止timer線程。如果Timer線程中存在多個計劃任務,其中一個計劃任務拋出未檢查的異常,則會引起整個Timer線程結束,從而導致其他計劃任務無法得到繼續(xù)執(zhí)行。  

2) Timer線程時基于絕對時間(如:2023/02/14 16:06:00),因此計劃任務對系統(tǒng)的時間的改變是敏感的。

3) Timer是單線程,如果某個任務很耗時,可能會影響其他計劃任務的執(zhí)行。

因此,JDK1.5以上建議使用ScheduledThreadPoolExecutor來代替Timer執(zhí)行計劃任務。

二 操作案例

2.1 一個Timer執(zhí)行多個Task,堵塞現(xiàn)象

package com.ljf.lockdemo.task.timerdemo;

import java.util.Timer;
import java.util.TimerTask;

/**
 * @ClassName: TestDemo2
 * @Description: TODO
 * @Author: admin
 * @Date: 2024/03/02 11:30:06 
 * @Version: V1.0
 **/
public class TestDemo2 {
    public static void main(String[] args) {
        TimerTask task1=new TimerTask() {
            @Override
            public void run() {
                String name = Thread.currentThread().getName();
                System.out.println("[當前線程是:"+name+",執(zhí)行定時任務1:"+System.currentTimeMillis()+"]");
            }
        };

        TimerTask task2=new TimerTask() {
            @Override
            public void run() {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                String name = Thread.currentThread().getName();
                System.out.println("[當前線程是:"+name+",執(zhí)行定時任務2:"+System.currentTimeMillis()+"]");
            }
        };


        Timer timer=new Timer();
        timer.schedule(task2,10000);
        timer.schedule(task1,100,3000);

    }
}

結果:

2.2 異?,F(xiàn)象

現(xiàn)象操作,在timetask2中,模擬一個除以0的算術異常。

強調:在執(zhí)行任何一個任務的run方法時,一旦run拋出了異常,Timer線程就會退出,從而所有定時任務都會被取消。如果希望各個定時任務互不干擾,一定要在run方法內捕獲所有異常。

這里catch的異常為:integerrupteException

改成Exceptione 如圖

啟動兩個timer

總結

1個timer沒有cancel掉,使用的一直是一個線程id;1個timer關閉后,再每次new后,使用的線程id都不相同。

在1個timer中,開啟兩個timetask;這個兩個timertask串行執(zhí)行,單線程;使用的線程id是相同的。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 全面解析JPA?倉庫repository中的findAll()方法

    全面解析JPA?倉庫repository中的findAll()方法

    這篇文章主要介紹了全面解析JPA?倉庫repository中的findAll()方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java中synchronized和ReentrantLock的區(qū)別對比

    Java中synchronized和ReentrantLock的區(qū)別對比

    這篇文章主要介紹了Java中synchronized和ReentrantLock的區(qū)別對比,synchronized和ReentrantLock是Java中兩種主要的線程同步機制,它們都能保證線程安全,但在實現(xiàn)和功能上有明顯區(qū)別,需要的朋友可以參考下本篇介紹
    2026-01-01
  • kafka-console-consumer.sh使用2次grep管道無法提取消息的解決

    kafka-console-consumer.sh使用2次grep管道無法提取消息的解決

    這篇文章主要介紹了kafka-console-consumer.sh使用2次grep管道無法提取消息的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • spring cloud中啟動Eureka Server的方法

    spring cloud中啟動Eureka Server的方法

    本篇文章主要介紹了spring cloud中啟動Eureka Server的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java 自定義Spring框架與Spring IoC相關接口分析

    Java 自定義Spring框架與Spring IoC相關接口分析

    Spring框架是由于軟件開發(fā)的復雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務器端的開發(fā)
    2021-10-10
  • spring-data-redis連接操作redis的實現(xiàn)

    spring-data-redis連接操作redis的實現(xiàn)

    spring-data-redis則是對Jedis進行了高度封裝,使用起來非常方便。本文主要介紹了spring-data-redis連接操作redis的實現(xiàn),感興趣的可以了解一下
    2021-07-07
  • Java模擬單鏈表和雙端鏈表數(shù)據(jù)結構的實例講解

    Java模擬單鏈表和雙端鏈表數(shù)據(jù)結構的實例講解

    這篇文章主要介紹了Java模擬單鏈表和雙端鏈表數(shù)據(jù)結構的實例,注意這里的雙端鏈表不是雙向鏈表,是在單鏈表的基礎上保存有對最后一個鏈接點的引用,需要的朋友可以參考下
    2016-04-04
  • 基于spring注入為null的原因及解決方案

    基于spring注入為null的原因及解決方案

    這篇文章主要介紹了spring注入為null的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 如何使用IDEA查看java文件編譯后的字節(jié)碼內容

    如何使用IDEA查看java文件編譯后的字節(jié)碼內容

    這篇文章主要介紹了如何使用IDEA查看java文件編譯后的字節(jié)碼內容,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中的CountDownLatch簡單理解

    Java中的CountDownLatch簡單理解

    這篇文章主要介紹了Java中的CountDownLatch簡單理解,CountDownLatch是一個同步工具類,用來攜調多個線程之間的同步,它是是使用一個計數(shù)器進行實現(xiàn)的,計數(shù)器初始值為線程數(shù)量,需要的朋友可以參考下
    2024-01-01

最新評論

佛山市| 株洲县| 镇远县| 河间市| 抚顺县| 保定市| 囊谦县| 昌宁县| 小金县| 武宣县| 登封市| 都安| 枝江市| 阿荣旗| 眉山市| 玉田县| 清丰县| 富平县| 无为县| 清新县| 澄城县| 嘉义市| 固安县| 铁岭市| 苏尼特左旗| 明水县| 金山区| 金华市| 平定县| 平利县| 宝坻区| 辽中县| 扎鲁特旗| 星子县| 石台县| 黑龙江省| 五家渠市| 太白县| 阳山县| 阳城县| 叶城县|