線程池的工作原理

先看一個圖來簡單了解一下線程池的工作流程

QQ截圖20170405163205.png

1.線程池創(chuàng)建的Thread對象,run方法會通過阻塞隊列的take方法獲取一個Runnable對象
2.當(dāng)需要向線程池提交任務(wù)時會調(diào)用阻塞隊列的offer方法向隊列的尾部添加任務(wù)。
3.當(dāng)Runnable對象的run方法執(zhí)行完畢以后,Thread中的run方法又循環(huán)的從阻塞隊列中獲取下一個Runnable對象繼續(xù)執(zhí)行。

這樣就實現(xiàn)了Thread對象的重復(fù)利用,也就減少了創(chuàng)建線程和銷毀線程所消耗的資源。

我們再看一個例子

public class MyClass {

public static void main(String[] args) {

    ExecutorService threadPool = Executors.newFixedThreadPool(3);//線程池中,3工作線程
    threadPool.execute(new ThreadPoolDemo.Task("a"));
    threadPool.execute(new ThreadPoolDemo.Task("b"));
    threadPool.execute(new ThreadPoolDemo.Task("c"));
    threadPool.execute(new ThreadPoolDemo.Task("d"));
    threadPool.execute(new ThreadPoolDemo.Task("e"));
    threadPool.shutdown();

    System.out.println(threadPool.isShutdown());//是否執(zhí)行了shutdown
    System.out.println(threadPool.isTerminated());//是否執(zhí)行完所有的任務(wù)

    while(!threadPool.isTerminated()){
        //阻塞
    }
    System.out.println("OVER");
}

}

class ThreadPoolDemo {

static class Task implements Runnable {
    private String id;

    Task(String id) {
        this.id = id;
    }

    @Override
    public void run() {
        System.out.println("Thread " + id + " is run");
        try {
            //每個任務(wù)隨機(jī)延時1s以內(nèi)的時間以模擬線程的運(yùn)行
            Thread.sleep(new Random().nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread " + id + " run over");
    }
}

}

執(zhí)行結(jié)果
Thread b is run
Thread a is run
Thread c is run
true
false
Thread c run over
Thread d is run
Thread b run over
Thread e is run
Thread e run over
Thread d run over
Thread a run over
OVER

我們可以看到:
1.打印的方法isShutdown 和 isTerminated 分別是true 和 false,isShutdown表示是否執(zhí)行了shutdown,而isTerminated 指是否執(zhí)行完成所有的任務(wù)
2.線程池中固定只允許同時執(zhí)行的數(shù)量為3個,所以必須前3個執(zhí)行完至少一個后面的等待線程才能執(zhí)行
3.因為線程是并發(fā)執(zhí)行的,所以順序是亂序的,如果想順序可以把newFixedThreadPool(3)改為1,或者使用newSingleThreadExecutor。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 線程池的工作原理 、一個線程池管理了一組工作線程, 同時它還包括了一個用于放置等待執(zhí)行任務(wù)的任務(wù)隊列(阻塞隊列) ...
    六尺帳篷閱讀 1,254評論 0 10
  • 先看幾個概念:線程:進(jìn)程中負(fù)責(zé)程序執(zhí)行的執(zhí)行單元。一個進(jìn)程中至少有一個線程。多線程:解決多任務(wù)同時執(zhí)行的需求,合理...
    yeying12321閱讀 613評論 0 0
  • 并發(fā)的學(xué)習(xí)與使用系列 第五篇 線程池的技術(shù)背景 在面向?qū)ο缶幊讨校瑒?chuàng)建和銷毀對象是很費時間的,因為創(chuàng)建一個對象要獲...
    SilenceDut閱讀 1,111評論 1 24
  • 第三章 Java內(nèi)存模型 3.1 Java內(nèi)存模型的基礎(chǔ) 通信在共享內(nèi)存的模型里,通過寫-讀內(nèi)存中的公共狀態(tài)進(jìn)行隱...
    澤毛閱讀 4,495評論 2 21
  • 馬的意志 一匹健壯的駿馬,向著遠(yuǎn)方艱難跋涉,它懷著遠(yuǎn)大的夢想,用自己的足走遍千山萬水,游盡大山內(nèi)外,不負(fù)從小立下的...
    南溪向南北歌流海閱讀 454評論 0 0

友情鏈接更多精彩內(nèi)容