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

Java定時器Timer與TimerTask的使用詳解

 更新時間:2023年10月10日 09:07:25   作者:細嗅薔薇的大老虎  
這篇文章主要介紹了Java定時器Timer與TimerTask的使用詳解,在JDK類庫中Timer主要負責計劃任務的功能,也就是在指定時間執(zhí)行某一任務,執(zhí)行時候會在主線程之外起一個單獨的線程執(zhí)行指定的任務,該類主要是設置任務計劃,但封裝的類是TimerTask類,需要的朋友可以參考下

一:簡介

在JDK類庫中Timer主要負責計劃任務的功能,也就是在指定時間執(zhí)行某一任務,執(zhí)行時候會在主線程之外起一個單獨的線程執(zhí)行指定的任務。該類主要是設置任務計劃,但封裝的類是TimerTask類。 TimerTask是一個實現(xiàn)了Runnable接口的抽象類,代表一個可被執(zhí)行的任務,執(zhí)行任務的代碼要放在其子類中(TimerTask是抽象類)。

二:Timer整體類圖

在這里插入圖片描述

TimerTask類:主要為定時任務的具體內容。

Timer類中含有3個類:Timer、TimerThread、TaskQueue。

Timer類主要是設置定時任務,配置用戶期望的任務執(zhí)行時間、執(zhí)行次數(shù)、執(zhí)行內容

TimerThread類為Thread的擴展類,會一直從TaskQueue中獲取下標為1的TimerTask進行執(zhí)行。并根據(jù)該TimerTask是否需要重復執(zhí)行來決定是否放回到TaskQueue中。

TaskQueue中存放一些列將要執(zhí)行的TimerTask,以數(shù)組的形式存放,下標約?。ㄗⅲ合聵藶?不處理,即使用的最小下標為1),則表明優(yōu)先級越高。

public class Timer {
    //默認給線程命名:"Timer-" + serialNumber()
	public Timer() {
        this("Timer-" + serialNumber());
    }
    //指定Timer的名字
    public Timer(String name) {
        thread.setName(name);
        thread.start();
    }
    //isDaemon:是否為守護線程
    public Timer(boolean isDaemon) {
        this("Timer-" + serialNumber(), isDaemon);
    }
    //給定線程名字,守護線程與否
    public Timer(String name, boolean isDaemon) {
        thread.setName(name);
        //setDaemon是指定線程是否為守護線程,true是守護線程,當主線程退出,      守護線程退出
        thread.setDaemon(isDaemon);
        thread.start();
    }    
}
//TimerThread類 繼承Thread
class TimerThread extends Thread{
	private void mainLoop() {
	......
	//每次執(zhí)行下標為1的TimerTask
	task = queue.getMin();
	......
	}
}
//TaskQueue 類
class TaskQueue {
	//TaskQueue 中存儲TimerTask
    private TimerTask[] queue = new TimerTask[128];
    //返回數(shù)組中下標1的TimerTask
    TimerTask getMin() {
        return queue[1];
    }
}

三:Timer常用方法

1.Timer 類void schedule(TimerTask task, Date time)方法

1.task是定時任務,time是task任務執(zhí)行時間.如果time時間早于當前則立即執(zhí)行,否則在time時間執(zhí)行。

2.task只執(zhí)行一次,且執(zhí)行完Timer線程任務不結束,因為Timer不是守護線程,Timer timer = new Timer(true);
是指定Timer 為守護線程,當task執(zhí)行結束后,Timer 線程會立即結束。

3.Timer 可以執(zhí)行多個定時任務,TimerTask 將會按照隊列的方式一個一個被執(zhí)行,如果前面的任務耗時長,后面的任務執(zhí)行時間將會相應的延后。

public class TimerDemo {
	//指定Timer為守護線程,run方法結束Timer線程會結束。
    private static Timer timer = new Timer(true);
    //TimerTask 具體的定時任務
    static public class MyTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("已運行,時間為:" + new Date());
        }
    }
    public static void main(String[] args) {
    	//創(chuàng)建定時任務
        MyTask myTask = new MyTask();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //早于當前時間,定時任務會立即執(zhí)行
        String dateString = "2020-06-01 09:56:00";
        try {
            Date taskDate = sdf.parse(dateString);
            //啟動定時任務
            timer.schedule(myTask,taskDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

結果:

已運行,時間為:Wed Jul 01 14:48:06 CST 2020

2.Timer 類void schedule(TimerTask task, Date firstTime, long period)方法

TimerTask任務在指定 firstTime任務之后,周期性每隔period時間,無限期循環(huán)的執(zhí)行某一任務。

3.TimerTask 類boolean cancel()方法

TimerTask 類boolean cancel()方法,是將自身任務從任務隊列中移除。

public class TimerDemo {
    private static Timer timer = new Timer();
    static public class MyTaskA extends TimerTask {
        @Override
        public void run() {
        	//只輸出一次,MyTaskA 任務將會移除
            System.out.println("MyTaskA已運行,時間為:" + new Date());
            //執(zhí)行TimerTask的cancel方法,將自身任務從隊列中移除
            this.cancel();
        }
    }
    static public class MyTaskB extends TimerTask {
        @Override
        public void run() {
        	//移除MyTaskA任務,MyTaskB 任務不受影響
            System.out.println("MyTaskB已運行,時間為:" + new Date());
        }
    }
    public static void main(String[] args) {
        MyTaskA myTaskA = new MyTaskA();
        MyTaskB myTaskB = new MyTaskB();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = "2020-07-01 15:19:00";
        try {
            Date taskDate = sdf.parse(dateString);
            timer.schedule(myTaskA,taskDate,2000);
            timer.schedule(myTaskB,taskDate,2000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

結果:

MyTaskA已運行,時間為:Wed Jul 01 15:24:47 CST 2020
MyTaskB已運行,時間為:Wed Jul 01 15:24:47 CST 2020
MyTaskB已運行,時間為:Wed Jul 01 15:24:49 CST 2020
MyTaskB已運行,時間為:Wed Jul 01 15:24:51 CST 2020
MyTaskB已運行,時間為:Wed Jul 01 15:24:53 CST 2020
MyTaskB已運行,時間為:Wed Jul 01 15:24:55 CST 2020
MyTaskB已運行,時間為:Wed Jul 01 15:24:57 CST 2020
MyTaskB已運行,時間為:Wed Jul 01 15:24:59 CST 2020

4.Timer 類void cancel()方法

Timer 類void cancel()方法與TimerTask 類boolean cancel()方法將自身任務從任務隊列中移除不同,它是將所有的任務都從隊列中移除。

public class TimerDemo {
    private static Timer timer = new Timer();
    static public class MyTaskA extends TimerTask {
        @Override
        public void run() {
            System.out.println("MyTaskA已運行,時間為:" + new Date());
            //執(zhí)行Timer類的cancel方法,將Timer中所有任務從隊列中移除
            timer.cancel();
        }
    }
    static public class MyTaskB extends TimerTask {
        @Override
        public void run() {
            //MyTaskB也會被移除,因為MyTaskA與MyTaskB是隊列執(zhí)行,先執(zhí)行MyTaskA再執(zhí)行MyTaskB
            //MyTaskA中走了timer.cancel(),所以MyTaskB不會執(zhí)行
            System.out.println("MyTaskB已運行,時間為:" + new Date());
        }
    }
    public static void main(String[] args) {
        MyTaskA myTaskA = new MyTaskA();
        MyTaskB myTaskB = new MyTaskB();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = "2020-07-01 15:19:00";
        try {
            Date taskDate = sdf.parse(dateString);
            timer.schedule(myTaskA,taskDate,2000);
            timer.schedule(myTaskB,taskDate,2000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

結果

MyTaskA已運行,時間為:Wed Jul 01 16:20:48 CST 2020

源碼:

public void cancel() {
        synchronized(queue) {
            thread.newTasksMayBeScheduled = false;
            queue.clear();
            queue.notify();  // In case queue was already empty.
        }
    }

執(zhí)行cancel需要搶占queue鎖,如果搶不到,則TimerTask 任務會繼續(xù)執(zhí)行。

5.Timer 類 void schedule(TimerTask task, long delay)方法

該方法以schedule(TimerTask task, long delay)方法的執(zhí)行時間為基準,在此時間上延遲指定的毫秒數(shù)delay后執(zhí)行一次TimerTask 任務。

6.Timer 類 void schedule(TimerTask task, long delay, long period)方法

該方法以schedule(TimerTask task, long delay, long period)方法的執(zhí)行時間為基準,在此時間上延遲指定的毫秒數(shù)delay后,執(zhí)行TimerTask 任務,之后間隔period毫秒無限循環(huán)執(zhí)行TimerTask 任務。

7.Timer 類void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)方法

TimerTask任務在指定 firstTime任務之后,周期性每隔period時間,無限期循環(huán)的執(zhí)行某一任務。

四:重點

scheduleAtFixedRate(TimerTask task, Date firstTime, long period)與 schedule(TimerTask task, Date firstTime, long period)方法區(qū)別

1.相同點:兩個方法都是按照順序執(zhí)行,無線程安全問題

2.任務不延時相同點:如果任務執(zhí)行時間小于任務時間間隔,則第二次任務的開始時間是任務開始時間+period

3.任務延時相同點:如果任務執(zhí)行時間大于任務時間間隔,導致第二次任務開始時候,上一個任務還未結束,則第二次任務的開始時間是在第一次任務結束時候立即執(zhí)行。

scheduleAtFixedRate方法與schedule方法的追趕性問題

scheduleAtFixedRate方法具有追趕性?。。。∪绻媱潏?zhí)行時間早于當前時間,執(zhí)行scheduleAtFixedRate方法后立即執(zhí)行定時任務,根據(jù)任務間隔時間與當前時間減去計劃執(zhí)行時間,補上之前少執(zhí)行的任務。 schedule方法不具有追趕性。?。。?!

public class TimerDemo {
    private static Timer timer = new Timer();
    static public class MyTaskA extends TimerTask {
        @Override
        public void run() {
            System.out.println("MyTaskA已運行,時間為:" + new Date());
            try {
                //任務執(zhí)行時間是1s
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("MyTaskA已結束,時間為:" + new Date());
        }
    }
    public static void main(String[] args) {
        MyTaskA myTaskA = new MyTaskA();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = "2020-07-02 14:31:00";
        try {
            Date taskDate = sdf.parse(dateString);
            //3s執(zhí)行一次任務
            timer.scheduleAtFixedRate(myTaskA,taskDate,3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

結果:

MyTaskA已運行,時間為:Thu Jul 02 14:34:38 CST 2020
MyTaskA已結束,時間為:Thu Jul 02 14:34:39 CST 2020
MyTaskA已運行,時間為:Thu Jul 02 14:34:39 CST 2020
MyTaskA已結束,時間為:Thu Jul 02 14:34:40 CST 2020
MyTaskA已運行,時間為:Thu Jul 02 14:34:40 CST 2020
MyTaskA已結束,時間為:Thu Jul 02 14:34:41 CST 2020
MyTaskA已運行,時間為:Thu Jul 02 14:34:41 CST 2020
MyTaskA已結束,時間為:Thu Jul 02 14:34:42 CST 2020
MyTaskA已運行,時間為:Thu Jul 02 14:34:42 CST 2020
MyTaskA已結束,時間為:Thu Jul 02 14:34:43 CST 2020
MyTaskA已運行,時間為:Thu Jul 02 14:34:43 CST 2020
MyTaskA已結束,時間為:Thu Jul 02 14:34:44 CST 2020
MyTaskA已運行,時間為:Thu Jul 02 14:34:44 CST 2020
MyTaskA已結束,時間為:Thu Jul 02 14:34:45 CST 2020
MyTaskA已運行,時間為:Thu Jul 02 14:34:45 CST 2020
MyTaskA已結束,時間為:Thu Jul 02 14:34:46 CST 2020
MyTaskA已運行,時間為:Thu Jul 02 14:34:46 CST 2020

由上述執(zhí)行結果可知,在Thu Jul 02 14:34:38 CST 2020啟動定時任務后,沒有間隔3s再執(zhí)行下一次任務,而是任務結束就立即執(zhí)行,這是因為任務計劃執(zhí)行時間早于當前時間,需要將這期間沒有執(zhí)行的任務補上。

五: 總結

java中可以使用定時任務的功能,針對不同的定時任務可以根據(jù)不同的API進行處理,從本質來說改技術仍然屬于多線程,基于多線程實現(xiàn),不管用再多的框架實現(xiàn)定時器功能,請不要忘了這事java基礎,框架實現(xiàn)的基礎。

到此這篇關于Java定時器Timer與TimerTask的使用詳解的文章就介紹到這了,更多相關Java定時器Timer與TimerTask內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • springboot整合mqtt的步驟示例詳解

    springboot整合mqtt的步驟示例詳解

    MQTT(Message Queuing Telemetry Transport)是一種輕量級的消息傳輸協(xié)議,適用于物聯(lián)網設備之間的通信,本文介紹Spring Boot整合MQTT的實現(xiàn),涵蓋依賴引入、YML配置、配置類創(chuàng)建、自定義注解及使用示例,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • Netty中解碼器的作用及實現(xiàn)詳解

    Netty中解碼器的作用及實現(xiàn)詳解

    這篇文章主要介紹了Netty中解碼器的作用及實現(xiàn)詳解,本章我們只需要讓客戶端發(fā)送消息的時候循環(huán)發(fā)送100次,服務端不變,看看服務端是不是接收到了100條消息,需要的朋友可以參考下
    2023-12-12
  • Java?超基礎講解String的使用

    Java?超基礎講解String的使用

    字符串廣泛應用?在?Java?編程中,在?Java?中字符串屬于對象,Java?提供了?String?類來創(chuàng)建和操作字符串,讓我們一起來了解它
    2022-04-04
  • C++/java 繼承類的多態(tài)詳解及實例代碼

    C++/java 繼承類的多態(tài)詳解及實例代碼

    這篇文章主要介紹了C++/java 繼承類的多態(tài)詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-02-02
  • Java實現(xiàn)Random隨機數(shù)生成雙色球號碼

    Java實現(xiàn)Random隨機數(shù)生成雙色球號碼

    使用Random類是Java中用于生成隨機數(shù)的標準類,本文主要介紹了Java實現(xiàn)Random隨機數(shù)生成雙色球號碼,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • MyBatis分頁查詢與特殊字符處理方式

    MyBatis分頁查詢與特殊字符處理方式

    這篇文章主要介紹了MyBatis分頁查詢與特殊字符處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 解讀Camunda中強大的監(jiān)聽服務

    解讀Camunda中強大的監(jiān)聽服務

    本文介紹Camunda中三種常用監(jiān)聽接口(ExecutionListener、JavaDelegate、TaskListener)及其區(qū)別,強調Expression和DelegateExpression的使用優(yōu)勢,并指導Spring Boot工程搭建與數(shù)據(jù)庫配置,建議使用H2數(shù)據(jù)庫簡化開發(fā)
    2025-09-09
  • Java實現(xiàn)Kafka生產者和消費者的示例

    Java實現(xiàn)Kafka生產者和消費者的示例

    這篇文章主要介紹了Java實現(xiàn)Kafka生產者和消費者的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • springboot整合websocket實現(xiàn)群聊思路代碼詳解

    springboot整合websocket實現(xiàn)群聊思路代碼詳解

    通過springboot引入websocket,實現(xiàn)群聊,通過在線websocket測試進行展示。本文重點給大家介紹springboot整合websocket實現(xiàn)群聊功能,代碼超級簡單,感興趣的朋友跟隨小編一起學習吧
    2021-05-05
  • Java實現(xiàn)身份證號碼驗證源碼示例分享

    Java實現(xiàn)身份證號碼驗證源碼示例分享

    本篇文章主要介紹了Java實現(xiàn)身份證號碼驗證源碼示例分享,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論

濮阳县| 博罗县| 濮阳县| 射阳县| 乳源| 八宿县| 南涧| 桃园市| 建湖县| 海门市| 鹤岗市| 门头沟区| 叶城县| 阜平县| 伊通| 禹州市| 新巴尔虎左旗| 蒙自县| 五指山市| 游戏| 河北省| 荥阳市| 泰和县| 河北省| 七台河市| 福海县| 安庆市| 宁乡县| 万山特区| 河北省| 晋中市| 南皮县| 洞口县| 鄢陵县| 隆林| 休宁县| 浮梁县| 共和县| 商丘市| 保康县| 枣阳市|