亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

《java.util.concurrent 包源碼閱讀》14 線程池系列之ScheduledThreadPoolExecutor 第一部分

2019-11-14 20:57:43
字體:
來源:轉載
供稿:網友
java.util.concurrent 包源碼閱讀》14 線程池系列之ScheduledThreadPoolExecutor 第一部分

ScheduledThreadPoolExecutor是ThreadPoolExecutor的子類,同時實現了ScheduledExecutorService接口。

public class ScheduledThreadPoolExecutor        extends ThreadPoolExecutor        implements ScheduledExecutorService

ScheduledThreadPoolExecutor的功能主要有兩點:在固定的時間點執行(也可以認為是延遲執行),重復執行。

和分析ThreadPoolExecutor時一樣,首先來看核心方法execute:

    public void execute(Runnable command) {        schedule(command, 0, TimeUnit.NANOSECONDS);    }

execute方法調用了另外一個方法schedule,同時我們發現三個submit方法也是同樣調用了schedule方法,因為有兩種類型的任務:Callable和Runnable,因此schedule也有兩個重載方法。

    public ScheduledFuture<?> schedule(Runnable command,                                       long delay,                                       TimeUnit unit) {        if (command == null || unit == null)            throw new NullPointerException();        RunnableScheduledFuture<?> t = decorateTask(command,            new ScheduledFutureTask<Void>(command, null,                                          triggerTime(delay, unit)));        delayedExecute(t);        return t;    }    public <V> ScheduledFuture<V> schedule(Callable<V> callable,                                           long delay,                                           TimeUnit unit) {        if (callable == null || unit == null)            throw new NullPointerException();        RunnableScheduledFuture<V> t = decorateTask(callable,            new ScheduledFutureTask<V>(callable,                                       triggerTime(delay, unit)));        delayedExecute(t);        return t;    }

兩個方法邏輯基本一致,都是把任務包裝成RunnableScheduledFuture對象,然后調用delayedExecute來實現延遲執行。任務包裝類繼承自ThreadPoolExecutor的包裝類RunnableFuture,同時實現ScheduledFuture接口使包裝類具有了延遲執行和重復執行這些功能以匹配ScheduledThreadPoolExecutor。

因此首先來看ScheduledFutureTask,以下是ScheduledFutureTask專有的幾個變量:

PRivate class ScheduledFutureTask<V>            extends FutureTask<V> implements RunnableScheduledFuture<V> {        /** 針對線程池所有任務的序列號 */        private final long sequenceNumber;        /** 距離任務開始執行的時間,納秒為單位 */        private long time;        /**         * 重復執行任務的間隔,即每隔多少時間執行一次任務         */        private final long period;        /** 重復執行任務和排隊時用這個類型的對象, */        RunnableScheduledFuture<V> outerTask = this;        /**         * 在延遲隊列的索引,這樣取消任務時使用索引會加快查找速度         */        int heapIndex;

來看核心方法run:

        public void run() {            boolean periodic = isPeriodic();            // 檢測是否可以運行任務,這里涉及到另外兩個變量:continueExistingPeriodicTasksAfterShutdown            // 和executeExistingDelayedTasksAfterShutdown            // 前者允許在shutdown之后繼續執行重復執行的任務            // 后者允許在shutdown之后繼續執行延時執行的任務,            // 因此這里根據任務是否為periodic來決定采用哪個選項,然后            // 如果線程池正在運行,那么肯定可以執行            // 如果正在shutdown,那么要看選項的值是否為true來決定是否允許執行任務            // 如果不被允許的話,就會取消任務            if (!canRunInCurrentRunState(periodic))                cancel(false);            // 如果可以執行任務,對于不用重復執行的任務,直接執行即可            else if (!periodic)                ScheduledFutureTask.super.run();            // 對于需要重復執行的任務,則執行一次,然后reset            // 更新一下下次執行的時間,調用reExecutePeriodic更新任務在執行隊列的            // 位置(其實就是添加到隊列的末尾)            else if (ScheduledFutureTask.super.runAndReset()) {                setNextRunTime();                reExecutePeriodic(outerTask);            }        }

因此這里可以得出關于重復執行的實現:任務執行一次,Reset狀態,重新加入到任務隊列。

回到delayedExecute,它可以保證任務在準確時間點執行,來看delayedExecute是如果實現延遲執行的:

    private void delayedExecute(RunnableScheduledFuture<?> task) {        if (isShutdown())            reject(task);        else {            super.getQueue().add(task);            if (isShutdown() &&                !canRunInCurrentRunState(task.isPeriodic()) &&                remove(task))                task.cancel(false);            else                ensurePrestart();        }    }

乍看之下,發現也就是把任務加入到任務隊列中,那么這個延時執行的功能是如何實現的,秘密就在任務隊列的實現。

    public ScheduledThreadPoolExecutor(int corePoolSize) {        super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,              new DelayedWorkQueue());    }    public ThreadPoolExecutor(int corePoolSize,                              int maximumPoolSize,                              long keepAliveTime,                              TimeUnit unit,                              BlockingQueue<Runnable> workQueue) {        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,             Executors.defaultThreadFactory(), defaultHandler);    }

ScheduledThreadPoolExecutor的任務隊列不是普通的BlockingQueue,而是一個特殊的實現DelayedWorkQueue。下一篇文章就來說說這個DelayedWorkQueue。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩一区二区三区在线免费观看| 一区二区三区久久精品| 美日韩在线视频| 91视频8mav| 欧美日韩福利视频| 日韩av黄色在线观看| 亚洲国产精品va| 亚洲欧美国产日韩中文字幕| 日韩精品久久久久久福利| 欧美日韩人人澡狠狠躁视频| 午夜精品久久久久久久久久久久久| 亚洲自拍小视频免费观看| 午夜精品久久久久久久男人的天堂| 国产欧洲精品视频| 久久久极品av| 国产视频精品va久久久久久| 国产欧美一区二区三区久久人妖| 欧美电影免费观看高清| 久久国产精品久久久久久久久久| 亲爱的老师9免费观看全集电视剧| 成人免费网站在线| 久久精品国产电影| 国产一区二区在线免费| 亚洲精品国产精品自产a区红杏吧| 亚洲精品电影在线观看| 日韩不卡在线观看| 91欧美日韩一区| 91亚洲精品一区二区| 欧美亚洲在线视频| 久久久精品国产网站| 欧美激情久久久久| 中文字幕亚洲一区在线观看| 91久久国产精品91久久性色| 中文字幕亚洲欧美日韩在线不卡| 国产精品网红直播| 国产主播喷水一区二区| 欧美丝袜一区二区| 久久久久久久成人| 狠狠躁夜夜躁久久躁别揉| 91免费综合在线| 久久在线视频在线| 欧美激情视频一区二区三区不卡| 欧美国产日本在线| 欧美成人sm免费视频| 国语对白做受69| 国产精品一区二区三区在线播放| 亚洲欧美在线第一页| 国产精品网站大全| 亚洲国产精品一区二区三区| 8090理伦午夜在线电影| 日本高清不卡的在线| 久久久久久久久久亚洲| …久久精品99久久香蕉国产| 欧美激情一区二区三区成人| 超碰97人人做人人爱少妇| 亚洲综合中文字幕在线观看| 亚洲人成电影网站| 亚洲qvod图片区电影| 97久久久免费福利网址| 久久69精品久久久久久久电影好| 欧美另类交人妖| 日韩不卡中文字幕| 最近2019中文免费高清视频观看www99| 欧美理论电影在线观看| 国产精品第10页| 88国产精品欧美一区二区三区| 日韩成人中文字幕在线观看| 国产欧美日韩91| 欧美性受xxxx白人性爽| 精品爽片免费看久久| 日韩黄色高清视频| 国产亚洲免费的视频看| 国产精品成人免费电影| 久久久成人精品| 国产精品九九久久久久久久| 日韩精品中文字幕在线| 久久精品亚洲一区| 91wwwcom在线观看| 国产精品一区久久久| 国产免费观看久久黄| 亚洲精品电影在线观看| 国产97人人超碰caoprom| 亚洲免费视频一区二区| 日本亚洲欧洲色| 日本a级片电影一区二区| 北条麻妃久久精品| 日韩精品www| y97精品国产97久久久久久| 亚洲自拍另类欧美丝袜| 国产主播喷水一区二区| 97不卡在线视频| 久久久精品国产一区二区| 亚洲变态欧美另类捆绑| 97视频人免费观看| 精品久久久免费| 精品久久久视频| 亚洲天堂av女优| 中文字幕欧美国内| 欧美性猛交xxxx乱大交3| 在线日韩中文字幕| 亚洲aⅴ日韩av电影在线观看| 亚洲成avwww人| 欧美午夜美女看片| 91中文在线观看| 97婷婷大伊香蕉精品视频| 国产精品h在线观看| 性视频1819p久久| 欧美性xxxx极品高清hd直播| 久久亚洲精品一区| 久久久久久九九九| 国产精品永久免费| 国产性猛交xxxx免费看久久| 日韩美女在线播放| 日韩欧美中文第一页| 久久久久久久激情视频| 久久久久久高潮国产精品视| 中文字幕日韩精品有码视频| 久久久国产精品亚洲一区| 久久久爽爽爽美女图片| 欧美日韩免费观看中文| 国产精品成av人在线视午夜片| 久久国产精品影片| 亚洲天堂av网| 国产精品久久久久久久久久ktv| 国产精品亚洲激情| 成人xvideos免费视频| 久久久国产成人精品| 国内精品久久久久| 欧美日韩国产激情| 日韩欧美大尺度| 日韩中文视频免费在线观看| 国产精品国产自产拍高清av水多| 欧美超级免费视 在线| 亚洲丁香婷深爱综合| 久久久久久久香蕉网| 日韩在线免费观看视频| 亚洲电影免费在线观看| 久久中文字幕在线视频| 久久久久日韩精品久久久男男| 久热精品视频在线观看| 欧美日韩在线观看视频| 亚洲欧洲国产精品| 国产精品久久久久久久久免费看| 欧洲午夜精品久久久| 亚洲精品理论电影| 91高清视频免费| 国语对白做受69| 国产网站欧美日韩免费精品在线观看| 97在线看福利| 午夜精品久久久久久久男人的天堂| 中文字幕日韩在线视频| 日韩在线欧美在线| www.亚洲一区| 欧美高清激情视频| 欧美性色视频在线| 久久久久久香蕉网| 亚洲黄页网在线观看| 亚洲精品suv精品一区二区| 欧美电影免费观看大全| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久久国产精品一区| 日韩毛片在线观看| 亚洲第一精品夜夜躁人人爽| 亚洲欧美激情一区|