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

Java?DelayQueue實(shí)現(xiàn)任務(wù)延時(shí)示例講解

 更新時(shí)間:2022年09月29日 15:50:25   作者:xiaoguangtouqiang  
DelayQueue是一個(gè)無(wú)界的BlockingQueue的實(shí)現(xiàn)類,用于放置實(shí)現(xiàn)了Delayed接口的對(duì)象,其中的對(duì)象只能在其到期時(shí)才能從隊(duì)列中取走。本文就來(lái)利用DelayQueue實(shí)現(xiàn)延時(shí)任務(wù),感興趣的可以了解一下

在項(xiàng)目中有使用到延時(shí)隊(duì)列的場(chǎng)景,做個(gè)簡(jiǎn)單的記錄說(shuō)明;首先DelayQueue實(shí)現(xiàn)了BlockingQueue,加入其中的元素必須實(shí)現(xiàn)Delayed接口;

當(dāng)生產(chǎn)者元素調(diào)用put往其中加入元素時(shí),出發(fā)Delayed接口的compareTo方法進(jìn)行排序,這個(gè)排序是按照時(shí)間的,按照計(jì)劃執(zhí)行的時(shí)間排序,先執(zhí)行的在前面,后執(zhí)行的排后面;消費(fèi)者獲取元素時(shí),調(diào)用getDelay方法返回的值大于0,則消費(fèi)者線程wait返回的這個(gè)時(shí)間后,再?gòu)年?duì)列頭部取出元素;下面是個(gè)簡(jiǎn)單的例子

import org.jetbrains.annotations.NotNull;
import java.util.Date;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class DelayEntity implements Delayed {
    private static final Long currentTime = System.currentTimeMillis();
    private String str;
    private Long scheduleTime;
    public DelayEntity(String str, Long delayed) {
        this.str = str;
        scheduleTime = System.currentTimeMillis() + (1000) * delayed;
    }
    @Override
    public long getDelay(@NotNull TimeUnit unit) {
        return unit.convert(scheduleTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }
    @Override
    public int compareTo(@NotNull Delayed o) {
        return (int) (this.scheduleTime - ((DelayEntity) o).scheduleTime);
    }
    public String getStr() {
        return str;
    }
    public Long getScheduleTime() {
        return scheduleTime;
    }
    public String showScheduleTime() {
        return "計(jì)劃執(zhí)行時(shí)間:" + new Date(this.scheduleTime).toString();
    }
}
@Test
    public void test() throws InterruptedException {
        DelayQueue<DelayEntity> delayQueue = new DelayQueue<>();
        delayQueue.put(new DelayEntity("1", 1l));
        delayQueue.put(new DelayEntity("2", 2l));
        delayQueue.put(new DelayEntity("4", 3l));
        while (true) {
            DelayEntity take = delayQueue.take();
            System.out.println("參數(shù):" + take.getStr() + ";計(jì)劃執(zhí)行時(shí)間:" + take.showScheduleTime() + ";實(shí)際執(zhí)行時(shí)間:" + new Date().toString());
        }
    }

下面看下take方法

public E take() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            for (;;) {
                E first = q.peek();
                if (first == null)
                    available.await();
                else {
                    long delay = first.getDelay(NANOSECONDS);
                    if (delay <= 0)
                        return q.poll();
                    first = null; // don't retain ref while waiting
                    if (leader != null)
                        available.await();
                    else {
                        Thread thisThread = Thread.currentThread();
                        leader = thisThread;
                        try {
                            available.awaitNanos(delay);
                        } finally {
                            if (leader == thisThread)
                                leader = null;
                        }
                    }
                }
            }
        } finally {
            if (leader == null && q.peek() != null)
                available.signal();
            lock.unlock();
        }
    }

這里可以看到,他不是一直循環(huán)的,是獲取到第一個(gè)元素的delay等待的時(shí)間,之后等待這個(gè)時(shí)間才去喚醒其他線程;

另外,添加元素時(shí),add方法和put方法都是調(diào)用的offer方法,區(qū)別是一個(gè)返回值,一個(gè)沒(méi)有;

延伸下BlockingQueue的幾個(gè)常用的操作;

1.offer方法是BlockingQueue的,offer不會(huì)阻塞執(zhí)行的方法,可以添加返回true,否則返回false;

2.BlockingQueue的put方法,如果沒(méi)有空間,會(huì)阻塞一直等到有空間

3.poll獲取元素,不會(huì)阻塞,獲取不到就返回null;

4.take,獲取不到就阻塞

到此這篇關(guān)于Java DelayQueue實(shí)現(xiàn)任務(wù)延時(shí)示例講解的文章就介紹到這了,更多相關(guān)Java DelayQueue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java判斷map是否為null或者空的方法小結(jié)

    Java判斷map是否為null或者空的方法小結(jié)

    這篇文章主要介紹了Java 如何判斷map為null或者空,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • java基礎(chǔ)知識(shí)I/O流使用詳解

    java基礎(chǔ)知識(shí)I/O流使用詳解

    編程語(yǔ)言的I/O類庫(kù)中常常使用流這個(gè)抽象的概念,它代表任何有能力產(chǎn)生數(shù)據(jù)的數(shù)據(jù)源對(duì)象或時(shí)有能力接收數(shù)據(jù)的接收端對(duì)象,本文為大家介紹Java中I/O系統(tǒng)基礎(chǔ)知識(shí)
    2014-01-01
  • java 打印一字符串,并在main()方法內(nèi)調(diào)用它

    java 打印一字符串,并在main()方法內(nèi)調(diào)用它

    編寫(xiě)一個(gè)方法(名字自定,但要符合Java編碼規(guī)范),方法內(nèi)打印一字符串,并在main()方法內(nèi)調(diào)用它。
    2017-02-02
  • mybatis interceptor 處理查詢參數(shù)及查詢結(jié)果的實(shí)例代碼

    mybatis interceptor 處理查詢參數(shù)及查詢結(jié)果的實(shí)例代碼

    這篇文章主要介紹了mybatis interceptor 處理查詢參數(shù)及查詢結(jié)果,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-01-01
  • Java Lambda表達(dá)式的方法引用和構(gòu)造器引用實(shí)例分析

    Java Lambda表達(dá)式的方法引用和構(gòu)造器引用實(shí)例分析

    這篇文章主要介紹了Java Lambda表達(dá)式的方法引用和構(gòu)造器引用,結(jié)合實(shí)例形式分析了Lambda表達(dá)式的方法引用和構(gòu)造器引用相關(guān)原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • 詳解Java中方法next()和nextLine()的區(qū)別與易錯(cuò)點(diǎn)

    詳解Java中方法next()和nextLine()的區(qū)別與易錯(cuò)點(diǎn)

    這篇文章主要介紹了詳解Java中方法next()和nextLine()的區(qū)別與易錯(cuò)點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • springboot集成CAS實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

    springboot集成CAS實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

    這篇文章主要介紹了springboot集成CAS實(shí)現(xiàn)單點(diǎn)登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Spring Boot實(shí)戰(zhàn)之模板引擎

    Spring Boot實(shí)戰(zhàn)之模板引擎

    這篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之模板引擎,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • java如何將控制臺(tái)輸出日志寫(xiě)入到指定文件中

    java如何將控制臺(tái)輸出日志寫(xiě)入到指定文件中

    這篇文章主要介紹了java如何將控制臺(tái)輸出日志寫(xiě)入到指定文件中問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Springdoc替換swagger的實(shí)現(xiàn)步驟分解

    Springdoc替換swagger的實(shí)現(xiàn)步驟分解

    最近在spring看到的,spring要對(duì)api文檔動(dòng)手了,有些人說(shuō)swagger不好用,其實(shí)也沒(méi)那么不好用,有人說(shuō)代碼還是有點(diǎn)侵入性,這倒是真的,我剛試了springdoc可以說(shuō)還是有侵入性但是也可以沒(méi)有侵入性,這就看你對(duì)文檔有什么要求了
    2023-02-02

最新評(píng)論

枣强县| 苏州市| 永春县| 乌海市| 吴堡县| 太原市| 桐梓县| 额敏县| 兴山县| 墨竹工卡县| 金沙县| 绵竹市| 义马市| 武宣县| 通海县| 丹寨县| 峡江县| 育儿| 视频| 铁力市| 梨树县| 大连市| 阳东县| 增城市| 清苑县| 玛沁县| 福建省| 灵寿县| 西宁市| 奇台县| 安泽县| 海阳市| 建水县| 隆尧县| 沙田区| 仪陇县| 全南县| 永胜县| 黄龙县| 焦作市| 青河县|