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

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

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

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

先來看ThreadPoolExecutor的execute方法,這個方法能體現出一個Task被加入到線程池之后都發生了什么:

    public void execute(Runnable command) {        if (command == null)            throw new NullPointerException();        /* 如果運行中的worker線程數少于設定的常駐線程數,增加worker線程,把task分配給新建的worker線程 */        int c = ctl.get();        if (workerCountOf(c) < corePoolSize) {            if (addWorker(command, true))                return;            c = ctl.get();        }        // 如果任務可以被加入到任務隊列中,即等待的任務數還在允許的范圍內,        // 再次檢查線程池是否被關閉,如果關閉的話,則移除任務并拒絕該任務        if (isRunning(c) && workQueue.offer(command)) {            int recheck = ctl.get();            if (! isRunning(recheck) && remove(command))                reject(command);            else if (workerCountOf(recheck) == 0)                addWorker(null, false);        }        // 如果任務數超過了現有worker線程的承受范圍,嘗試新建worker線程        // 如果無法添加新的worker線程,則會拒絕該任務        else if (!addWorker(command, false))            reject(command);    }

在執行任務時,需要經常檢查線程池的狀態,那么接下來說說線程池是如何進行狀態控制的。上面的代碼有個成員變量叫做ctl,它用于標記線程池狀態和worker線程的數量,是一個AutomaticInteger對象。

    PRivate final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

ctl是一個32位的整數,最高的3位表示狀態:

111為running,

000為shutdown,

001為stop,

010為tidying,

011為ternimated。

因此狀態值就是這三位加上29個0,因此running的值是個負整數(最高位為1),其他狀態都是正整數,后面判斷狀態會比較值的大小時會用到這點。

剩下的29位表示worker線程的數量(因此最大允許的線程數就是2的29方減1)。

這里是說說這幾個狀態的意義,這幾個狀態發生的順序正好就是上面列出的順序:

running表示正常運行狀態

shutdown狀態意味著發出了一個shutdown信號,類似于你點擊了windows的關機按鈕

stop表示shutdown信號收到,等于windows響應了這個信號,發出正在關機的信息

tidying發生在stop之后做出的響應,表示這個時候在清理一些資源,

ternimated發生在tidying完成之后,表示關閉完成。

接著來看添加一個worker線程時都發生了什么:

    private boolean addWorker(Runnable firstTask, boolean core) {        retry:        for (;;) {            int c = ctl.get();            int rs = runStateOf(c);            // 返回false的情況:            // 1. rs>shutdown,即shutdown和running以外的狀態            // 2. shutdown的狀態            //     1)firstTask不為null,即有task分配            //     2)沒有task,但是workQueue(等待任務隊列)為空            if (rs >= SHUTDOWN &&                ! (rs == SHUTDOWN &&                   firstTask == null &&                   ! workQueue.isEmpty()))                return false;            for (;;) {                // 1. 如果沒有設定線程數的限制,worker線程數不能大于最大值(2的29次方-1)                // 2. 如果是固定尺寸的線程池,不能大于固定尺寸                // 3. 如果是可擴展的線程池,不能大于規定的線程數的上限                int wc = workerCountOf(c);                if (wc >= CAPACITY ||                    wc >= (core ? corePoolSize : maximumPoolSize))                    return false;                // 用CAS操作增加線程數量,如果失敗,重新循環                if (compareAndIncrementWorkerCount(c))                    break retry;                c = ctl.get();  // Re-read ctl                if (runStateOf(c) != rs)                    continue retry;                loop            }        }        // 新建worker線程        Worker w = new Worker(firstTask);        Thread t = w.thread;        final ReentrantLock mainLock = this.mainLock;        mainLock.lock();        try {            int c = ctl.get();            int rs = runStateOf(c);            // 檢查以下任一狀態是否出現:            // 1. 創建線程失敗            // 2. rs>shutdown,即shutdown和running以外的狀態            // 3. rs==shutdown,有任務分配            if (t == null ||                (rs >= SHUTDOWN &&                 ! (rs == SHUTDOWN &&                    firstTask == null))) {                decrementWorkerCount();                tryTerminate();                return false;            }            workers.add(w);            int s = workers.size();            if (s > largestPoolSize)                largestPoolSize = s;        } finally {            mainLock.unlock();        }        t.start();        // 這里考慮一種極少出現的情況,如果worker線程調用start沒有完成時,        // 線程池進入Stop狀態,這個時候會調用Thread#interrupt中斷每個        // worker線程,但是 interrupt對沒有start的線程不一定起作用,這樣        // 就會漏掉了對這個thread的interrupt,因此在worker線程start之后        // 檢查以下,如果stop了,而這個線程卻沒有被interrupt,補上這個漏掉        // 的interrupt。        if (runStateOf(ctl.get()) == STOP && ! t.isInterrupted())            t.interrupt();        return true;    }

這篇文章主要講線程池如何處理任務,下一篇文章將會講worker線程是如何工作的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品欧美一区二区三区| 成人日韩在线电影| 亚洲国产女人aaa毛片在线| 欧美另类第一页| 久久久久久久999| 国产精品日韩欧美| 欧美大肥婆大肥bbbbb| 91在线观看免费网站| 性色av一区二区三区| 亚洲精品影视在线观看| 亚洲欧美日韩一区二区三区在线| 亚洲国产精品成人精品| 91免费看片在线| 91免费看片网站| 亚洲欧美一区二区三区久久| 日韩在线小视频| 91po在线观看91精品国产性色| 久久亚洲春色中文字幕| 欧美极品少妇全裸体| 在线日韩av观看| 亚洲成人黄色网址| 欧美丝袜美女中出在线| 久热精品在线视频| 久久99热这里只有精品国产| 51精品在线观看| 国产视频福利一区| 中文字幕国产日韩| 91亚洲精品一区二区| 亚洲免费视频网站| 国产一区二区欧美日韩| 久久人人看视频| 亚洲大胆人体av| 中文字幕免费国产精品| 国产成人福利夜色影视| 亚洲精品小视频在线观看| 日韩欧美一区二区在线| 日韩风俗一区 二区| 萌白酱国产一区二区| 欧美日韩亚洲一区二区三区| 久久久久久97| 日本久久久久久久久| 久久综合久中文字幕青草| 成人福利在线观看| 亚洲社区在线观看| 色中色综合影院手机版在线观看| 性亚洲最疯狂xxxx高清| 性日韩欧美在线视频| 国产精品久久久久久久7电影| 亚洲美女又黄又爽在线观看| 大桥未久av一区二区三区| 欧洲亚洲免费视频| 亚洲人成伊人成综合网久久久| 欧美有码在线观看视频| 国产福利精品av综合导导航| 久久久久久九九九| 久久91亚洲精品中文字幕| 久久久久久尹人网香蕉| 亚洲欧美国产另类| 久久99亚洲精品| 91精品国产自产在线观看永久| 亚洲 日韩 国产第一| 亚洲一区二区日本| 成人国产精品av| 国产精品美女午夜av| 在线a欧美视频| 日韩欧美在线网址| 欧美资源在线观看| 亚洲男人av电影| 亚洲美腿欧美激情另类| 欧美激情成人在线视频| 人九九综合九九宗合| 国产日韩精品电影| 欧美极品少妇xxxxⅹ喷水| 亚洲成人国产精品| 欧美理论电影在线观看| 日本午夜精品理论片a级appf发布| 亚洲午夜未删减在线观看| 亚洲欧美一区二区精品久久久| 98午夜经典影视| 亚洲精品在线观看www| 欧美精品日韩三级| 久久久久女教师免费一区| 粉嫩老牛aⅴ一区二区三区| 精品视频久久久久久| 久久噜噜噜精品国产亚洲综合| 亚洲最大激情中文字幕| 国产精品丝袜久久久久久不卡| 亚洲四色影视在线观看| 欧美视频在线视频| 亚洲精品少妇网址| 91在线免费看网站| 欧美日韩亚洲精品一区二区三区| 国产91精品久久久久久| 久久久久久久999| 欧美日韩在线视频首页| 久久精品国产亚洲一区二区| 欧美电影免费观看电视剧大全| 国产午夜精品视频| 欧美激情一二三| 亚洲欧美日韩视频一区| 久久人91精品久久久久久不卡| 亚洲护士老师的毛茸茸最新章节| 日av在线播放中文不卡| 久久精品久久久久久国产 免费| 97免费中文视频在线观看| 欧美成人小视频| 欧美裸体xxxx极品少妇| 97国产真实伦对白精彩视频8| 精品综合久久久久久97| 97国产一区二区精品久久呦| 亚洲欧美中文在线视频| 69av成年福利视频| 国产精自产拍久久久久久蜜| 青青青国产精品一区二区| 精品国产乱码久久久久久虫虫漫画| 成人美女免费网站视频| 亚洲欧美精品在线| 久久久久久久久久久久av| 国产精品人成电影在线观看| 在线免费看av不卡| 国产精品三级网站| 亚洲图片制服诱惑| 91精品国产777在线观看| 国产精品视频久| 日韩中文字幕第一页| 欧美高清理论片| 不卡av电影院| 亚洲精品日韩久久久| 色悠悠国产精品| 国产偷亚洲偷欧美偷精品| 国内偷自视频区视频综合| 国产91热爆ts人妖在线| 日韩一区二区三区在线播放| 奇米成人av国产一区二区三区| 欧美高跟鞋交xxxxxhd| 国产91在线高潮白浆在线观看| 亚洲欧美日本精品| 国产午夜精品麻豆| 丝袜一区二区三区| 夜夜嗨av一区二区三区免费区| 欧美激情在线一区| 亚洲人免费视频| 大桥未久av一区二区三区| 国产日韩欧美一二三区| 欧美中文在线视频| 26uuu国产精品视频| 亚洲欧美在线一区二区| 日韩精品在线视频美女| 亚洲欧美日韩国产中文专区| 精品久久久久久久久久| 久久久久北条麻妃免费看| 久久亚洲精品成人| 国产成人aa精品一区在线播放| 精品国产美女在线| 亚洲电影中文字幕| 日本亚洲欧洲色α| www.亚洲人.com| 欧美与黑人午夜性猛交久久久| 日韩**中文字幕毛片| 亚洲自拍另类欧美丝袜| 欧美一级片在线播放| 久久久久国产精品一区| 日韩黄色高清视频| 国产91在线播放精品91|