国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java | 多線程案例】定時(shí)器的實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了【Java | 多線程案例】定時(shí)器的實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

個(gè)人主頁(yè):兜里有顆棉花糖
歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng)
收錄于專(zhuān)欄【Java系列專(zhuān)欄】【JaveEE學(xué)習(xí)專(zhuān)欄】
本專(zhuān)欄旨在分享學(xué)習(xí)JavaEE的一點(diǎn)學(xué)習(xí)心得,歡迎大家在評(píng)論區(qū)交流討論??

一、Timer定時(shí)器

Java中,Timer類(lèi)是用于計(jì)劃和執(zhí)行重復(fù)任務(wù)的類(lèi)(Java標(biāo)準(zhǔn)庫(kù)中確實(shí)提供了java.util.Timer類(lèi))。它可以在指定的時(shí)間間隔內(nèi)重復(fù)執(zhí)行一個(gè)任務(wù),或者在指定時(shí)間點(diǎn)執(zhí)行任務(wù)。

二、Timer定時(shí)器的設(shè)計(jì)

選擇java.util包中的Timer類(lèi):
【Java | 多線程案例】定時(shí)器的實(shí)現(xiàn),Java系列,JavaEE學(xué)習(xí)專(zhuān)欄,java,開(kāi)發(fā)語(yǔ)言

【Java | 多線程案例】定時(shí)器的實(shí)現(xiàn),Java系列,JavaEE學(xué)習(xí)專(zhuān)欄,java,開(kāi)發(fā)語(yǔ)言
使用了Timer類(lèi)的schedule()方法來(lái)安排一個(gè)任務(wù)在延遲3000毫秒后執(zhí)行。在TimerTask的run()方法中,我們編寫(xiě)需要執(zhí)行的具體任務(wù)邏輯。
我們現(xiàn)在來(lái)了解一下TimerTask()這個(gè)抽象類(lèi)(如下圖):該類(lèi)是一個(gè)抽象類(lèi),并且繼承了Runnable方法。創(chuàng)建了一個(gè)匿名內(nèi)部類(lèi)并實(shí)現(xiàn)了run()方法。這個(gè)匿名內(nèi)部類(lèi)可以被認(rèn)為是繼承了TimerTask抽象類(lèi),并提供了具體的實(shí)現(xiàn)代碼。
【Java | 多線程案例】定時(shí)器的實(shí)現(xiàn),Java系列,JavaEE學(xué)習(xí)專(zhuān)欄,java,開(kāi)發(fā)語(yǔ)言
調(diào)用timer.schedule()方法注冊(cè)的任務(wù),會(huì)由Timer內(nèi)部的線程池去執(zhí)行,而不是由調(diào)用schedule()方法的線程直接執(zhí)行run()方法。
Timer類(lèi)內(nèi)部創(chuàng)建了一個(gè)線程池,用于執(zhí)行注冊(cè)的定時(shí)任務(wù)。當(dāng)調(diào)用schedule()方法后,Timer會(huì)將傳入的TimerTask對(duì)象添加到線程池中進(jìn)行調(diào)度。

下面是一個(gè)簡(jiǎn)單的定時(shí)器程序,可以運(yùn)行試試看:

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

public class Demo22 {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello world!!!");
            }
        },3000);
        System.out.println("程序開(kāi)始執(zhí)行嘍!!!");
    }
}

運(yùn)行結(jié)果如下:
【Java | 多線程案例】定時(shí)器的實(shí)現(xiàn),Java系列,JavaEE學(xué)習(xí)專(zhuān)欄,java,開(kāi)發(fā)語(yǔ)言
可以看到程序并沒(méi)有結(jié)束進(jìn)程,原因如下:
Timer內(nèi)部有自己的線程,為了保證隨時(shí)處理新安排的任務(wù),此線程會(huì)一直持續(xù)的執(zhí)行,即此線程影響了阻止來(lái)整個(gè)進(jìn)程的結(jié)束。

定時(shí)器是支持多個(gè)任務(wù)同時(shí)執(zhí)行的,請(qǐng)看:
【Java | 多線程案例】定時(shí)器的實(shí)現(xiàn),Java系列,JavaEE學(xué)習(xí)專(zhuān)欄,java,開(kāi)發(fā)語(yǔ)言
【Java | 多線程案例】定時(shí)器的實(shí)現(xiàn),Java系列,JavaEE學(xué)習(xí)專(zhuān)欄,java,開(kāi)發(fā)語(yǔ)言

三、定時(shí)器的實(shí)現(xiàn)

代碼實(shí)現(xiàn)如下:

import java.util.Comparator;
import java.util.PriorityQueue;

class MyTimerTask implements Comparable<MyTimerTask> {
    private long time; // 表示任務(wù)什么時(shí)候開(kāi)始執(zhí)行
    private Runnable runnable; // 表示具體任務(wù)是啥

    public MyTimerTask(Runnable runnable,long delay) {
        // delay是一個(gè)相對(duì)的時(shí)間差
        time = System.currentTimeMillis() + delay;// 這里計(jì)算出任務(wù)執(zhí)行的具體時(shí)間
        this.runnable = runnable;
    }

    public long getTime() {
        return time;
    }

    public Runnable getRunnable() {
        return runnable;
    }


    @Override
    public int compareTo(MyTimerTask o) {
        // 時(shí)間最少的元素放在隊(duì)首,即時(shí)間越少優(yōu)先級(jí)越高
        return (int)(this.time - o.time); // time是long類(lèi)型
    }
}

// 這是定時(shí)器類(lèi)的本體
class MyTimer {
    // 使用優(yōu)先級(jí)隊(duì)列來(lái)保存上面的N個(gè)任務(wù)
    private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();
    // locker是用來(lái)加鎖的對(duì)象
    private Object locker = new Object();

    // 定時(shí)器的核心方法,即把要執(zhí)行的任務(wù)添加到隊(duì)列中
    public void schedule(Runnable runnable,long delay) {
        synchronized (locker) {
            MyTimerTask task = new MyTimerTask(runnable,delay);
            queue.offer(task);
            // 每次來(lái)新的任務(wù)之后都會(huì)喚醒一下掃描線程,此時(shí)掃描線程就可以根據(jù)最新的任務(wù)情況來(lái)重新規(guī)劃等待時(shí)間
            locker.notify();
        }
    }
    // MyTimer類(lèi)中還需要一個(gè)掃描線程,一方面要負(fù)責(zé)檢查隊(duì)首元素是否是此時(shí)應(yīng)該被執(zhí)行的。
    // 另一方面,當(dāng)任務(wù)到點(diǎn)開(kāi)始執(zhí)行之后,需要調(diào)用Runnable中的run方法來(lái)完成任務(wù)
    public MyTimer() {
        // 掃描線程
        Thread t = new Thread(() -> {
            while(true) {
                try {
                    synchronized(locker) {
                        while(queue.isEmpty()) {
                            // 隊(duì)列為空時(shí),此時(shí)不應(yīng)該取這里的元素
                            locker.wait();
                        }
                        MyTimerTask task = queue.peek();
                        long curTime = System.currentTimeMillis();
                        if(curTime > task.getTime()) {
                            // 如果當(dāng)前時(shí)間晚于任務(wù)的執(zhí)行時(shí)間,就意味著我們要執(zhí)行這個(gè)任務(wù)了
                            queue.poll();
                            task.getRunnable().run(); // 至此就可以執(zhí)行該任務(wù)了
                        } else {
                            // 如果當(dāng)前時(shí)間早于任務(wù)的執(zhí)行時(shí)間,誒呀太早了,讓這個(gè)線程(休眠)休息一會(huì)一會(huì)吧!!!
                            // Thread.sleep(task.getTime() - curTime);
                            locker.wait(task.getTime() - curTime);
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
    }

}

public class Demo23 {
    public static void main(String[] args) {
        MyTimer timer = new MyTimer();
        timer.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world! 3");
            }
        },3000);
        timer.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world! 2");
            }
        },2000);
        timer.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world! 1");
            }
        },1000);
        System.out.println("程序開(kāi)始執(zhí)行!!!");
    }
}

運(yùn)行結(jié)果如下:
【Java | 多線程案例】定時(shí)器的實(shí)現(xiàn),Java系列,JavaEE學(xué)習(xí)專(zhuān)欄,java,開(kāi)發(fā)語(yǔ)言

四、總結(jié)

Timer類(lèi)是Java中的定時(shí)工具類(lèi),它可以幫助我們實(shí)現(xiàn)在指定時(shí)間執(zhí)行指定任務(wù)的功能。Timer類(lèi)提供了一個(gè)方法即schedule方法,我們可以通過(guò)schedule方法來(lái)注冊(cè)一個(gè)任務(wù)并指定執(zhí)行該任務(wù)的時(shí)間,當(dāng)執(zhí)行時(shí)間到的時(shí)候,Timer類(lèi)內(nèi)部的線程就會(huì)負(fù)責(zé)調(diào)用執(zhí)行注冊(cè)的任務(wù)。

另外我們可以通過(guò)優(yōu)先級(jí)隊(duì)列的方式來(lái)實(shí)現(xiàn)類(lèi)似于Timer類(lèi)這樣的定時(shí)器。

本文到這里就結(jié)束了,希望友友們可以支持一下一鍵三連哈。嗯,就到這里吧,再見(jiàn)啦!??!

【Java | 多線程案例】定時(shí)器的實(shí)現(xiàn),Java系列,JavaEE學(xué)習(xí)專(zhuān)欄,java,開(kāi)發(fā)語(yǔ)言文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-773935.html

到了這里,關(guān)于【Java | 多線程案例】定時(shí)器的實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【javaEE】阻塞隊(duì)列、定時(shí)器、線程池

    【javaEE】阻塞隊(duì)列、定時(shí)器、線程池

    目錄 ??一、阻塞隊(duì)列 1.概念 2.生產(chǎn)者消費(fèi)者模型 3.阻塞隊(duì)列的實(shí)現(xiàn) ??二、定時(shí)器 1.引出定時(shí)器 2.定時(shí)器的實(shí)現(xiàn) ??三、線程池 1.引出線程池 2.ThreadPoolExecutor 構(gòu)造方法 3.標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)的4種拒絕策略【經(jīng)典面試題】【重點(diǎn)掌握】 4.線程池的實(shí)現(xiàn) ? 1.概念 ?對(duì)于隊(duì)列,首先我們想

    2023年04月21日
    瀏覽(20)
  • 【JavaEE初階】多線程(四)阻塞隊(duì)列 定時(shí)器 線程池

    【JavaEE初階】多線程(四)阻塞隊(duì)列 定時(shí)器 線程池

    概念 阻塞隊(duì)列是一種特殊的隊(duì)列. 也遵守 “ 先進(jìn)先出 ” 的原則. 阻塞隊(duì)列能是一種線程安全的數(shù)據(jù)結(jié)構(gòu), 并且具有以下特性: 當(dāng)隊(duì)列滿的時(shí)候, 繼續(xù)入隊(duì)列就會(huì)阻塞, 直到有其他線程從隊(duì)列中取走元素. 當(dāng)隊(duì)列空的時(shí)候, 繼續(xù)出隊(duì)列也會(huì)阻塞,直到有其他線程往隊(duì)列中插入元素

    2023年04月26日
    瀏覽(20)
  • Java 多線程系列Ⅳ(單例模式+阻塞式隊(duì)列+定時(shí)器+線程池)

    Java 多線程系列Ⅳ(單例模式+阻塞式隊(duì)列+定時(shí)器+線程池)

    設(shè)計(jì)模式就是軟件開(kāi)發(fā)中的“棋譜”,軟件開(kāi)發(fā)中也有很多常見(jiàn)的 “問(wèn)題場(chǎng)景”。針對(duì)這些問(wèn)題場(chǎng)景,大佬們總結(jié)出了一些固定的套路。按照這些套路來(lái)實(shí)現(xiàn)代碼可能不會(huì)很好,但至少不會(huì)很差。當(dāng)前階段我們需要掌握兩種設(shè)計(jì)模式: (1)單例模式 (2)工廠模式 概念/特征

    2024年02月09日
    瀏覽(25)
  • 多線程案例(3)-定時(shí)器

    大家好,我是曉星航。今天為大家?guī)?lái)的是 多線程案例三 相關(guān)的講解!?? 定時(shí)器是什么 定時(shí)器也是軟件開(kāi)發(fā)中的一個(gè)重要組件. 類(lèi)似于一個(gè) “鬧鐘”. 達(dá)到一個(gè)設(shè)定的時(shí)間之后, 就執(zhí)行某個(gè)指定 好的代碼. 定時(shí)器是一種實(shí)際開(kāi)發(fā)中非常常用的組件. 比如網(wǎng)絡(luò)通信中, 如果對(duì)方

    2024年02月14日
    瀏覽(17)
  • 多線程案例 | 單例模式、阻塞隊(duì)列、定時(shí)器、線程池

    多線程案例 | 單例模式、阻塞隊(duì)列、定時(shí)器、線程池

    單例模式 單例模式是 設(shè)計(jì)模式 的一種 什么是設(shè)計(jì)模式? 設(shè)計(jì)模式好比象棋中的 “棋譜”,紅方當(dāng)頭炮,黑方馬來(lái)跳,針對(duì)紅方的一些走法,黑方應(yīng)招的時(shí)候有一些固定的套路,按照套路來(lái)走局勢(shì)就不會(huì)吃虧,也就發(fā)明了一組\\\"棋譜\\\",稱為設(shè)計(jì)模式 軟件開(kāi)發(fā)中也有很多常見(jiàn)

    2024年02月15日
    瀏覽(26)
  • 【JavaEE初階】 定時(shí)器詳解與實(shí)現(xiàn)

    【JavaEE初階】 定時(shí)器詳解與實(shí)現(xiàn)

    定時(shí)器也是軟件開(kāi)發(fā)中的一個(gè)重要組件. 類(lèi)似于一個(gè) “鬧鐘”. 達(dá)到一個(gè)設(shè)定的時(shí)間之后, 就執(zhí)行某個(gè)指定好的代碼 定時(shí)器是一種實(shí)際開(kāi)發(fā)中非常常用的組件. 比如網(wǎng)絡(luò)通信中, 如果對(duì)方 500ms 內(nèi)沒(méi)有返回?cái)?shù)據(jù), 則斷開(kāi)連接嘗試重連. 比如一個(gè) Map, 希望里面的某個(gè) key 在 3s 之后過(guò)

    2024年02月06日
    瀏覽(20)
  • java多線程之定時(shí)器

    java多線程之定時(shí)器

    定時(shí)功能在java中主要是通過(guò) Timer 類(lèi)實(shí)現(xiàn),因?yàn)樗趦?nèi)部還是使用多線程的方式進(jìn)行處理,所以和多線程技術(shù)還是有非常大的管理 在JDK庫(kù)中Timer類(lèi)主要負(fù)責(zé)計(jì)劃任務(wù)的功能,也就是在指定時(shí)間開(kāi)始執(zhí)行某一個(gè)任務(wù),Timer類(lèi)的主要功能就是設(shè)置計(jì)劃任務(wù),封裝任務(wù)的類(lèi)確是Timer

    2024年02月05日
    瀏覽(27)
  • 【Java|多線程與高并發(fā)】定時(shí)器(Timer)詳解

    【Java|多線程與高并發(fā)】定時(shí)器(Timer)詳解

    在Java中,定時(shí)器 Timer 類(lèi)是用于執(zhí)行定時(shí)任務(wù)的工具類(lèi)。它允許你安排一個(gè)任務(wù)在未來(lái)的某個(gè)時(shí)間點(diǎn)執(zhí)行,或者以固定的時(shí)間間隔重復(fù)執(zhí)行。 在服務(wù)器開(kāi)發(fā)中,客戶端向服務(wù)器發(fā)送請(qǐng)求,然后等待服務(wù)器響應(yīng). 但服務(wù)器什么時(shí)候返回響應(yīng),并不確定. 但也不能讓客戶端一直等下去

    2024年02月07日
    瀏覽(20)
  • C++ 實(shí)現(xiàn)定時(shí)器的兩種方法(線程定時(shí)和時(shí)間輪算法修改版)

    定時(shí)器要求在固定的時(shí)間異步執(zhí)行一個(gè)操作,比如boost庫(kù)中的boost::asio::deadline_timer,以及MFC中的定時(shí)器。也可以利用c++11的thread, mutex, condition_variable 來(lái)實(shí)現(xiàn)一個(gè)定時(shí)器。 1、使用C++11中的thread, mutex, condition_variable來(lái)實(shí)現(xiàn)一個(gè)定時(shí)器。 注:此算法會(huì)每一個(gè)任務(wù)創(chuàng)建一個(gè)線程,不推

    2024年02月05日
    瀏覽(28)
  • 【多線程】定時(shí)器,詳解定時(shí)器原理,讓大家更深刻的理解多線程

    【多線程】定時(shí)器,詳解定時(shí)器原理,讓大家更深刻的理解多線程

    前言: 大家好,我是 良辰丫 ,今天我們一起了解一下定時(shí)器,通過(guò)定時(shí)器來(lái)熟悉一下線程安全等相關(guān)知識(shí)點(diǎn).?????? ??個(gè)人主頁(yè):良辰針不戳 ??所屬專(zhuān)欄:javaEE初階 ??勵(lì)志語(yǔ)句:生活也許會(huì)讓我們遍體鱗傷,但最終這些傷口會(huì)成為我們一輩子的財(cái)富。 ??期待大家三連,關(guān)注

    2024年02月01日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包