1. 程式人生 > 實用技巧 >併發程式設計之程序理論及應用等相關內容-36

併發程式設計之程序理論及應用等相關內容-36

在說執行緒池之前先提一下執行緒的一種建立方式:

MyRuunable run=new MyRuunable();//繼承了Ruunable介面的實現類的物件,其實我們可以把run看成是執行緒需要跑的任務

Thread th=new Thread(run);//Thread就是執行緒,th就是執行緒物件,我們把run這個任務提交給th這個執行緒,然後執行緒執行run這個任務

明白了上面的意思再來說執行緒池:

執行緒池顧名思義,就是一個裝執行緒的池子,但是這個池子裡的執行緒是不能跑起來的,因為池子裡的執行緒

並沒有得到任務:就是沒有獲得上面講的run物件,如果想讓池子裡的執行緒跑起來那麼我們就需要給執行緒

池裡的執行緒提交一個任務。

建立執行緒池有兩種方法:

先來說比較簡單的一種方法:

程式碼:

    public static void main(String[] args) {
        //建立執行緒池的第一種方法
        ExecutorService contralPool = Executors.newFixedThreadPool(2);//通過Executors類的靜態方法newFixedThreadPool
//建立一個指定執行緒數量上限的執行緒池,並返回能聯絡和控制這個執行緒池的工具物件


        //比如說用這個工具提交任務給池子
        contralPool.submit(new
Runnable() { @Override public void run() { String name = Thread.currentThread().getName(); System.out.println(name + "迎風少年運行了"); } }); //再次提交 contralPool.submit(new Runnable() { @Override
public void run() { String name = Thread.currentThread().getName(); System.out.println(name + "迎風少年運行了"); } }); //再次提交 contralPool.submit(new Runnable() { @Override public void run() { String name = Thread.currentThread().getName(); System.out.println(name + "迎風少年運行了"); } }); }

第一種方法是通過:Executors(愛克斯卡特四)的靜態方法newFixedThreadPool(新混池,個人記憶不喜勿噴)建立一個指定執行緒數量上限的池子;執行緒池的上限是2.

ExecutorService contralPool = Executors.newFixedThreadPool(2);

上面程式碼的執行結果是:

第三個任務只能等到第一個被執行的任務被執行緒執行完了才能進入池子被空閒的執行緒執行,因為執行緒以先執行,所以當執行緒1執行完了之後執行緒1會執行第三個任務

需要注意的是操作執行緒工具在submit()任務給執行緒吃之後,不用呼叫start方法,如果池子裡有空閒執行緒,任務是直接執行的,沒有空閒執行緒,任務就會進入阻塞(等待)

狀態。

第二中建立執行緒池的方法:

  public static void main(String[] args) {
     //   method1();
        //建立執行緒池的第二種方法:
        //其實第一種的建立方法也是間接性的建立第二種,只不過第二種的建立由於建立時的引數列表比較多,所以第一種算是一種簡化
      /*  ThreadPoolExecutor contralpool=new ThreadPoolExecutor(
                3,     //核心執行緒
                5,//最大執行緒數量
                2,  //空閒時間最長副執行緒被清理
                TimeUnit.MILLISECONDS,//閒的時間單位
                new ArrayBlockingQueue<>(10),//阻塞佇列
                Executors.defaultThreadFactory(),//執行緒工廠
                new ThreadPoolExecutor.AbortPolicy());//拒絕策略

//一句口訣:核心最大,閒的時候排隊進場去拒絕*/
ThreadPoolExecutor contralpool=new ThreadPoolExecutor(
        3,
        5,
        2,
        TimeUnit.SECONDS,
        new ArrayBlockingQueue<>(10),
        Executors.defaultThreadFactory(),
        new ThreadPoolExecutor.AbortPolicy()
);

記住引數最多的應對起來才更方便