JUC--自定義線程池

自定義線程線程池

若是當前線程池中的線程數目小於corePoolSize,則每來一個任務,就會建立一個線程去執行這個任務;若是當前線程池中的線程數目>=corePoolSize,則每來一個任務,會嘗試將其添加到任務緩存隊列當中,若添加成功,則該任務會等待空閒線程將其取出去執行;若添加失敗(通常來講是任務緩存隊列已滿),則會嘗試建立新的線程去執行這個任務;若是隊列已經滿了,則在總線程數不大於maximumPoolSize的前提下,則建立新的線程 若是當前線程池中的線程數目達到maximumPoolSize,則會採起任務拒絕策略進行處理;若是線程池中的線程數量大於 corePoolSize時,若是某線程空閒時間超過keepAliveTime,線程將被終止,直至線程池中的線程數目不大於corePoolSize;若是容許爲核心池中的線程設置存活時間,那麼核心池中的線程空閒時間超過keepAliveTime,線程也會被終止。緩存

這是上篇文章講到的 線程池原理 https://blog.csdn.net/qq_41977838/article/details/105918233app

下面咱們利用原理自定義一個線程池ide

 
 
  1. public class Test0007 {this


  2.    public static void main(String[] args) {spa

  3.        ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 2, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));.net

  4.        for (int i = 1; i <= 6; i++) {線程

  5.            TaskThred t1 = new TaskThred("任務" + i);code

  6.            executor.execute(t1);orm

  7.        }blog

  8.        executor.shutdown();

  9.    }

  10. }


  11. class TaskThred implements Runnable {

  12.    private String taskName;


  13.    public TaskThred(String taskName) {

  14.        this.taskName = taskName;

  15.    }


  16.    @Override

  17.    public void run() {

  18.        System.out.println(Thread.currentThread().getName()+taskName);

  19.    }


  20. }

經過線程池原理咱們就能夠實現一個簡單的自定義線程池

  1. 咱們直接實現 new ThreadPoolExecutor(1, 2, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3)); (詳解:ThreadPoolExecutor 底層實現線程池方法,1:核心線程數,2:最大線程數,60L :線程沒有任務執行時最多保持多久時間會終止,TimeUnit.SECONDS:底層實現,表示一秒爲單位,new ArrayBlockingQueue<>(3) :ArrayBlockingQueue是一個阻塞式的隊列,傳入隊列個數 )

  2. 調用 executor.execute(t1);

結束 executor.shutdown();

相關文章
相關標籤/搜索