JUC——線程池技術相關內容

  • 線程池相關核心參數併發

    // 阻塞隊列。 private final BlockingQueue<Runnable> workQueue; // 互斥鎖 private final ReentrantLock mainLock = new ReentrantLock(); // 線程集合。一個Worker對應一個線程。 private final HashSet<Worker> workers = new HashSet<Worker>(); // 「終止條件」,與「mainLock」綁定。 private final Condition termination = mainLock.newCondition(); // 線程池中線程數量曾經達到過的最大值。 private int largestPoolSize; // 已完成任務數量 private long completedTaskCount; // ThreadFactory對象,用於建立線程。 private volatile ThreadFactory threadFactory; // 拒絕策略的處理句柄。 private volatile RejectedExecutionHandler handler; // 保持線程存活時間。 private volatile long keepAliveTime; //是否容許"線程在空閒狀態時,仍然可以存活" private volatile boolean allowCoreThreadTimeOut; // 核心池大小 private volatile int corePoolSize; // 最大池大小 private volatile int maximumPoolSize;線程

  1. workers workers是HashSet<Work>類型,即它是一個Worker集合。而一個Worker對應一個線程,也就是說線程池經過workers包含了"一個線程集合"。當Worker對應的線程池啓動時,它會執行線程池中的任務;當執行完一個任務後,它會從線程池的阻塞隊列中取出一個阻塞的任務來繼續運行。 wokers的做用是,線程池經過它實現了"容許多個線程同時運行"。對象

  2. workQueue workQueue是BlockingQueue類型,即它是一個阻塞隊列。當線程池中的線程數超過它的容量的時候,線程會進入阻塞隊列進行阻塞等待。 經過workQueue,線程池實現了阻塞功能。隊列

  3. mainLock mainLock是互斥鎖,經過mainLock實現了對線程池的互斥訪問。it

  4. corePoolSize和maximumPoolSize corePoolSize是"核心池大小",maximumPoolSize是"最大池大小"。它們的做用是調整"線程池中實際運行的線程的數量"。 例如,當新任務提交給線程池時(經過execute方法)。 -- 若是此時,線程池中運行的線程數量< corePoolSize,則建立新線程來處理請求。 -- 若是此時,線程池中運行的線程數量> corePoolSize,可是卻< maximumPoolSize;則僅當阻塞隊列滿時才建立新線程。 若是設置的 corePoolSize 和 maximumPoolSize 相同,則建立了固定大小的線程池。若是將 maximumPoolSize 設置爲基本的無界值(如 Integer.MAX_VALUE),則容許池適應任意數量的併發任務。在大多數狀況下,核心池大小和最大池大小的值是在建立線程池設置的;可是,也能夠使用 setCorePoolSize(int) 和 setMaximumPoolSize(int) 進行動態更改。io

  5. poolSize poolSize是當前線程池的實際大小,即線程池中任務的數量。thread

  6. allowCoreThreadTimeOut和keepAliveTime allowCoreThreadTimeOut表示是否容許"線程在空閒狀態時,仍然可以存活";而keepAliveTime是當線程池處於空閒狀態的時候,超過keepAliveTime時間以後,空閒的線程會被終止。線程池

  7. threadFactory threadFactory是ThreadFactory對象。它是一個線程工廠類,"線程池經過ThreadFactory建立線程"。請求

  8. handler handler是RejectedExecutionHandler類型。它是"線程池拒絕策略"的句柄,也就是說"當某任務添加到線程池中,而線程池拒絕該任務時,線程池會經過handler進行相應的處理"。方法

  • 拒絕策略介紹 當任務添加到線程池中之因此被拒絕,多是因爲:第一,線程池異常關閉。第二,任務數量超過線程池的最大限制。

    AbortPolicy -- 當任務添加到線程池中被拒絕時,它將拋出 RejectedExecutionException 異常。 CallerRunsPolicy -- 當任務添加到線程池中被拒絕時,會在線程池當前正在運行的Thread線程池中處理被拒絕的任務。 DiscardOldestPolicy -- 當任務添加到線程池中被拒絕時,線程池會放棄等待隊列中最舊的未處理任務,而後將被拒絕的任務添加到等待隊列中。 DiscardPolicy -- 當任務添加到線程池中被拒絕時,線程池將丟棄被拒絕的任務。

相關文章
相關標籤/搜索