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

Java中的定時(shí)器Timer詳解

 更新時(shí)間:2021年08月16日 11:37:58   作者:超新星燃燒  
這篇文章主要為大家詳細(xì)介紹了Java定時(shí)器Timer的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

簡(jiǎn)單來說,定時(shí)器就相當(dāng)于一個(gè)“鬧鐘”,給定時(shí)器設(shè)定一個(gè)任務(wù),約定這個(gè)任務(wù)在xxx時(shí)間之后執(zhí)行~

Timer類提供了一個(gè)核心接口,schedule(安排) 指定一個(gè)任務(wù)交給定時(shí)器,在一定時(shí)間之后再去執(zhí)行這個(gè)任務(wù)~

如何實(shí)現(xiàn)定時(shí)器的效果~

  • Timer中要包含一個(gè)Task類,每個(gè)Task就表示一個(gè)具體的任務(wù)實(shí)例,Task里面包含一個(gè)時(shí)間戳(啥時(shí)候執(zhí)行這個(gè)任務(wù)),還包含一個(gè)Runnable實(shí)例(用來表示任務(wù)具體是啥)。
  • Timer里面通過一個(gè)帶優(yōu)先級(jí)的阻塞隊(duì)列,來組織如干個(gè)task。
  • 這里的優(yōu)先級(jí)是按照時(shí)間的先后來排優(yōu)先級(jí),快要到時(shí)間的任務(wù)優(yōu)先級(jí)更高。
  • 也就是 給 堆 加上 wait/notify ,讓它能夠帶阻塞效果。
  • 標(biāo)準(zhǔn)庫里提供這樣的隊(duì)列PriorityBlockingQueue
  • Timer 中還需要一個(gè)專門的線程,讓這個(gè)線程不停的掃描隊(duì)首元素,看看隊(duì)首元素是不是已經(jīng)可以執(zhí)行了,如果可以執(zhí)行了,就執(zhí)行,反之繼續(xù)在隊(duì)列中等待。

具體如何用代碼實(shí)現(xiàn)這樣一個(gè)定時(shí)器Timer:

一般去設(shè)定時(shí)間的時(shí)候,傳入的時(shí)間,都是一個(gè)時(shí)間間隔

例如:傳入1000 ,就代表從當(dāng)前開始過1000ms之后在執(zhí)行;

而我這里為了后面代碼方便判斷,在這里記錄一下絕對(duì)時(shí)間,這樣this.time里就是一個(gè)標(biāo)志的ms級(jí)時(shí)間戳了,后續(xù)只需要獲取當(dāng)前時(shí)間戳在和這里的time對(duì)比一下就好了。

在這里插入圖片描述

Task 要放到一個(gè)優(yōu)先級(jí)隊(duì)列中,但是優(yōu)先級(jí)隊(duì)列里面是需要比較優(yōu)先級(jí)的,所以可以讓Task類實(shí)現(xiàn)Comparable接口,重寫compareTo方法來進(jìn)行比較。

在這里插入圖片描述

這里希望時(shí)間較小的排在見面。

在這里插入圖片描述

這里獲取一下當(dāng)前時(shí)間currTime,如果當(dāng)前時(shí)間大于等于task里約定的時(shí)間,超過說明時(shí)間到,執(zhí)行任務(wù),反之沒到,把取去的

任務(wù)再放回隊(duì)列,繼續(xù)等待。

在這里插入圖片描述

這里還涉及到一個(gè)問題:

舉個(gè)例子:假如你早上定了一個(gè)8.30的 鬧鐘,8點(diǎn)的時(shí)候你醒了,看了下時(shí)間,還沒到,你就繼續(xù)睡,

但是這里是while(true),就意味著每過一秒鐘就要看一次鬧鐘,8.01看一次,8.02看一次,這樣就會(huì)白白的浪費(fèi)一些資源,這就出現(xiàn)了“盲等”,在等待任務(wù)時(shí)間的過程中,一直持有著CPU資源~

所以這里就需要優(yōu)化一下:使用wait/notify機(jī)制,就可很好的改善盲等問題~

如果取出任務(wù)發(fā)現(xiàn)還沒到時(shí)間,就wait,等待一定時(shí)間,這里使用的wait()的重載版本,wait()里寫一個(gè)參數(shù),達(dá)到等待時(shí)間,自動(dòng)醒過來~ 此時(shí)就大大降低了掃描次數(shù)和成本,

在這里插入圖片描述

這里的notify(),就是保證當(dāng)線程中如果有線程在WAITING狀態(tài)的線程,就需要顯示的喚醒一下線程。

舉個(gè)例子;

如果隊(duì)首元素8.30在執(zhí)行,等待30分鐘,但是此時(shí),可能突然插入一個(gè)任務(wù),讓你8.10的時(shí)候去干一件事,如果你8.30再去喚醒的話,8.10的任務(wù)就來不及了!

所以每次插入新任務(wù)的時(shí)候,都喚醒一下woeker線程,讓worker線程重新獲取一下隊(duì)首元素,看看接下來的任務(wù)等待多少時(shí)間合適。

在這里插入圖片描述

//簡(jiǎn)單定時(shí)器
public class TestTimer {
    //每個(gè) Task 實(shí)例 就包含一個(gè)要執(zhí)行的任務(wù)
    //Task 要放到一個(gè)優(yōu)先級(jí)隊(duì)列中,但是優(yōu)先級(jí)隊(duì)列里面是需要比較優(yōu)先級(jí)的
    static class Task implements Comparable<Task>{
        //什么時(shí)候執(zhí)行
        private long time;
        //執(zhí)行什么任務(wù)
        private  Runnable command;

        public Task(Runnable command ,long time){
            this.command = command;
            this.time = System.currentTimeMillis()+time;
        }

        public void  run(){
        //執(zhí)行Runable 里面的run方法
            command.run();
        }

        @Override
        public int compareTo(Task o) {
            return (int)(this.time - o.time);
        }
    }
    static class Timer{
        //先創(chuàng)建一個(gè)帶優(yōu)先級(jí)的阻塞隊(duì)列
        private PriorityBlockingQueue<Task>  queue = new PriorityBlockingQueue<>();

        //用這個(gè)對(duì)象來完成線程之間的協(xié)調(diào)任務(wù)
        private Object meilbox = new Object();

        //schedule 方法就是把一個(gè)Task 放在Timer中
        public void schedule(Runnable command,long after){
            Task task = new Task(command,after);
            //將當(dāng)前任務(wù)放入對(duì)列
            queue.put(task);
            //當(dāng)worker 線程中包含wait機(jī)制的時(shí)候,在安排任務(wù)的時(shí)候就需要顯示的喚醒一下
            synchronized (meilbox){
                meilbox.notify();
            }
        }
        //寫一個(gè)構(gòu)造方法,創(chuàng)建線程
        public Timer(){
            //創(chuàng)建一個(gè)線程,讓這個(gè)線程去掃描隊(duì)列的隊(duì)首元素,看看能不能執(zhí)行
            Thread worker = new Thread(){
                @Override
                public void run() {
                    //取出隊(duì)首元素,判斷這個(gè)元素能不能執(zhí)行
                    while(true){
                        try {
                            Task task = queue.take();
                            long currTime = System.currentTimeMillis();
                            if(currTime >= task.time){
                                //時(shí)間到,執(zhí)行任務(wù)
                                task.run();
                            }else{
                                //時(shí)間沒到,繼續(xù)等待
                                queue.put(task);
                                synchronized (meilbox){
                                    meilbox.wait(task.time-currTime);
                                }
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            worker.start();
        }
    }
}

測(cè)試:

public static void main(String[] args) {
        Timer timer = new Timer();
        Runnable command = new Runnable() {
            @Override
            public void run() {
                System.out.println("時(shí)間到了~");
               // timer.schedule(this,3000); 每隔3是就執(zhí)行一次
            }
        };
        System.out.println("安排任務(wù)");
        timer.schedule(command,3000);
    }
}

安排任務(wù)后,等待3s就可以執(zhí)行了

在這里插入圖片描述

這里補(bǔ)充一下Timer原生類中的一些方法

  • schedule(TimerTask task, Date time)   在指定的日期執(zhí)行一次TimerTask任務(wù);如果日期time早于當(dāng)前時(shí)間,則立刻執(zhí)行。
  • schedule(TimerTask task, long delay, long period)   以當(dāng)前時(shí)間為基準(zhǔn),延遲指定的毫秒后,再按指定的時(shí)間間隔地?zé)o限次數(shù)的執(zhí)行TimerTask任務(wù)。
  • schedule(TimerTask task, Date firstTime, long period)   在指定的日期之后,按指定的時(shí)間間隔地?zé)o限次數(shù)的執(zhí)行TimerTask任務(wù)。
  • scheduleAtFixedRate(TimerTask task, long delay, long period)   以當(dāng)前時(shí)間為基準(zhǔn),延遲指定的毫秒后,再按指定的時(shí)間間隔周期性地?zé)o限次數(shù)的執(zhí)行TimerTask任務(wù)。

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • java中instanceof與Class的等價(jià)性代碼示例

    java中instanceof與Class的等價(jià)性代碼示例

    這篇文章主要介紹了java中instanceof與Class的等價(jià)性代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java中的自旋鎖與適應(yīng)性自旋鎖詳解

    Java中的自旋鎖與適應(yīng)性自旋鎖詳解

    這篇文章主要介紹了Java中的自旋鎖與適應(yīng)性自旋鎖詳解,在多處理器環(huán)境中某些資源的有限性,有時(shí)需要互斥訪問,這時(shí)候就需要引入鎖的概念,只有獲取了鎖的線程才能對(duì)資源進(jìn)行訪問,多線程的核心是CPU的時(shí)間分片,所以同一時(shí)刻只能有一個(gè)線程獲取到鎖,需要的朋友可以參考下
    2023-10-10
  • idea編寫java程序詳細(xì)圖文步驟

    idea編寫java程序詳細(xì)圖文步驟

    這篇文章主要給大家介紹了關(guān)于idea編寫java程序的詳細(xì)圖文步驟,IDEA是用于Java語言開發(fā)的集成環(huán)境,它是業(yè)界公認(rèn)的目前用于Java程序開發(fā)最好的工具,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Java?C++題解leetcode904水果成籃

    Java?C++題解leetcode904水果成籃

    這篇文章主要為大家介紹了Java?C++題解leetcode904水果成籃示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Java Assert.assertEquals案例詳解

    Java Assert.assertEquals案例詳解

    這篇文章主要介紹了Java Assert.assertEquals案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 如何通過properties文件配置web.xml中的參數(shù)

    如何通過properties文件配置web.xml中的參數(shù)

    這篇文章主要介紹了如何通過properties文件配置web.xml中的參數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Drools Fusion(CEP)定義及使用方法講解

    Drools Fusion(CEP)定義及使用方法講解

    今天小編就為大家分享一篇關(guān)于Drools Fusion(CEP)定義及使用方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 在Spring Boot中使用Spark Streaming進(jìn)行實(shí)時(shí)數(shù)據(jù)處理和流式計(jì)算的步驟

    在Spring Boot中使用Spark Streaming進(jìn)行實(shí)時(shí)數(shù)據(jù)處理和流式計(jì)算的步驟

    這篇文章主要介紹了在Spring Boot中使用Spark Streaming進(jìn)行實(shí)時(shí)數(shù)據(jù)處理和流式計(jì)算,通過本文的介紹,我們了解了在Spring Boot中使用Spark Streaming進(jìn)行實(shí)時(shí)數(shù)據(jù)處理和流式計(jì)算的詳細(xì)步驟,需要的朋友可以參考下
    2024-03-03
  • Java封裝數(shù)組之添加元素操作實(shí)例分析

    Java封裝數(shù)組之添加元素操作實(shí)例分析

    這篇文章主要介紹了Java封裝數(shù)組之添加元素操作,結(jié)合實(shí)例形式分析了Java封裝數(shù)組實(shí)現(xiàn)元素追加、插入等相關(guān)操作技巧,需要的朋友可以參考下
    2020-03-03
  • java構(gòu)造函數(shù)示例(構(gòu)造方法)

    java構(gòu)造函數(shù)示例(構(gòu)造方法)

    這篇文章主要介紹了java構(gòu)造函數(shù)示例(構(gòu)造方法),需要的朋友可以參考下
    2014-03-03

最新評(píng)論

缙云县| 道孚县| 定边县| 岑巩县| 武平县| 东安县| 昭平县| 平武县| 平武县| 绍兴市| 历史| 扎鲁特旗| 扎鲁特旗| 清远市| 阿坝县| 高碑店市| 莆田市| 盘山县| 栾川县| 祥云县| 民权县| 汤阴县| 惠来县| 合作市| 德兴市| 波密县| 磴口县| 庆安县| 阿克| 滦南县| 仪陇县| 睢宁县| 封开县| 周口市| 潼关县| 商丘市| 阳泉市| 自贡市| 兴安盟| 郁南县| 颍上县|