Java線程池的原理

先上個網(wǎng)圖說明下線程池的執(zhí)行過程


image.png

來看下線程池的執(zhí)行過程


image.png

1.當(dāng)線程池數(shù)量小于核心線程數(shù) 直接創(chuàng)建核心線程
2.隊列是否已滿萤皂,沒有的話 放入隊列

3.放入隊列失敗 添加非核心線程 失敗的話 處理失敗

很容易看出核心方法是addWork 這個方法是添加線程執(zhí)行的双揪,不做過多解釋愤诱。
在這個方法中調(diào)用了 start 方法藏否,這個很熟悉是啟動線程的方法介陶。
順藤破瓜看看Work的run方法 只有一個runWork方法

 final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // allow interrupts
        boolean completedAbruptly = true;
        try {
           // 保證核心線程默認(rèn)情況下不會被銷毀而是進(jìn)行阻塞(getTask()核心線程)
            while (task != null || (task = getTask()) != null) {
                w.lock();
                // 死循環(huán)保證線程不會結(jié)束 
                if ((runStateAtLeast(ctl.get(), STOP) ||
                     (Thread.interrupted() &&
                      runStateAtLeast(ctl.get(), STOP))) &&
                    !wt.isInterrupted())
                    wt.interrupt();
                try {
                    beforeExecute(wt, task);
                    Throwable thrown = null;
                    try {
                        //執(zhí)行真正的任務(wù)
                        task.run();
                    } catch (RuntimeException x) {
                        thrown = x; throw x;
                    } catch (Error x) {
                        thrown = x; throw x;
                    } catch (Throwable x) {
                        thrown = x; throw new Error(x);
                    } finally {
                        afterExecute(task, thrown);
                    }
                } finally {
                    task = null;
                    w.completedTasks++;
                    w.unlock();
                }
            }
            completedAbruptly = false;
        } finally {
            processWorkerExit(w, completedAbruptly);
        }
    }

重點是 getTask的執(zhí)行 包含了線程阻塞

private Runnable getTask() {
        boolean timedOut = false; // Did the last poll() time out?

        for (;;) {
            int c = ctl.get();
            int rs = runStateOf(c);

            // Check if queue empty only if necessary.
            if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
                decrementWorkerCount();
                return null;
            }

            int wc = workerCountOf(c);

            // Are workers subject to culling?
            boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;

            if ((wc > maximumPoolSize || (timed && timedOut))
                && (wc > 1 || workQueue.isEmpty())) {
                // 線程結(jié)束
                if (compareAndDecrementWorkerCount(c))
                    return null;
                continue;
            }

            try {
                Runnable r = timed ?
                    // 非核心線程超過時間會被淘汰 返回null 退出線程
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                   // 小于核心線程蔽氨,當(dāng)前待線程為0  阻塞線程保證默認(rèn)情況下的核心線程不會銷毀
                    workQueue.take();
                if (r != null)
                    return r;
                timedOut = true;
            } catch (InterruptedException retry) {
                timedOut = false;
            }
        }
    }

大體意思就是
不停的取task
超時退出線程
沒有任務(wù)時 阻塞線程 可以設(shè)置核心線程可以退出融师,這個時候線程不會阻塞

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市轻要,隨后出現(xiàn)的幾起案子复旬,更是在濱河造成了極大的恐慌,老刑警劉巖冲泥,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驹碍,死亡現(xiàn)場離奇詭異壁涎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)志秃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進(jìn)店門怔球,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洽损,你說我怎么就攤上這事庞溜。” “怎么了碑定?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵流码,是天一觀的道長。 經(jīng)常有香客問我延刘,道長漫试,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任碘赖,我火速辦了婚禮驾荣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘普泡。我一直安慰自己播掷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布撼班。 她就那樣靜靜地躺著歧匈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砰嘁。 梳的紋絲不亂的頭發(fā)上件炉,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天,我揣著相機(jī)與錄音矮湘,去河邊找鬼斟冕。 笑死,一個胖子當(dāng)著我的面吹牛缅阳,可吹牛的內(nèi)容都是我干的磕蛇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼十办,長吁一口氣:“原來是場噩夢啊……” “哼孤里!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起橘洞,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎说搅,沒想到半個月后炸枣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年适肠,在試婚紗的時候發(fā)現(xiàn)自己被綠了霍衫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡侯养,死狀恐怖敦跌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逛揩,我是刑警寧澤柠傍,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站辩稽,受9級特大地震影響惧笛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逞泄,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一患整、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喷众,春花似錦各谚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至父阻,卻和暖如春愈涩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背加矛。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工履婉, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斟览。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓毁腿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親苛茂。 傳聞我的和親對象是個殘疾皇子已烤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,442評論 2 359