欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java線程池對象ThreadPoolExecutor的深入講解

 更新時間:2018年09月03日 16:54:10   作者:大雨如注  
在我們的開發(fā)中“池”的概念并不罕見,有數(shù)據(jù)庫連接池、線程池、對象池、常量池等等。下面這篇文章主要給大家介紹了關(guān)于java線程池對象ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧

使用線程池的好處

1、降低資源消耗

可以重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。

2、提高響應(yīng)速度

當(dāng)任務(wù)到達(dá)時,任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行。

3、提高線程的可管理性

線程是稀缺資源,如果無限制地創(chuàng)建,不僅會消耗系統(tǒng)資源,還會降低系統(tǒng)的穩(wěn)定性,使用線程池可以進(jìn)行統(tǒng)一分配、調(diào)優(yōu)和監(jiān)控

ThreadPoolExecutor 介紹:

java 提供的線程池類;

ThreadPoolExecutor 作用:

兩個作用:

1,用于分離執(zhí)行任務(wù)和當(dāng)前線程;

2,主要設(shè)計初衷:重復(fù)利用Thread 對象;

ThreadPoolExecutor 使用:

實例化:

public ThreadPoolExecutor(int corePoolSize,
        int maximumPoolSize,
        long keepAliveTime,
        TimeUnit unit,
        BlockingQueue<Runnable> workQueue) {
  this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
    Executors.defaultThreadFactory(), defaultHandler);
 }

這是ThreadPoolExecutor的構(gòu)造方法之一,傳入?yún)?shù)最少,以下是參數(shù)說明:

corePoolSize  : 設(shè)置線程池的線程核心數(shù)量;該參數(shù)作用:當(dāng)向線程池中添加的任務(wù)數(shù)量小于核心數(shù)量時,線程池將優(yōu)先創(chuàng)建新的線程,而不是重用之前已存在的線程(不管該線程可用與否);

源碼佐證,ThreadPoolExecutor 的 execute(Runnable) 方法中有源碼如下:

maximumPoolSize : 設(shè)置線程池可創(chuàng)建最大線程數(shù)量;該參數(shù)作用:用于限制線程池?zé)o限制的創(chuàng)建線程;

源碼佐證,ThreadPoolExecutor 的 addWorker(Runnable ,boolean) 方法中有源碼如下:

keepAliveTime  : 設(shè)置線程池被創(chuàng)建線程的存活時間;

源碼佐證,ThreadPoolExecutor 的 getTask()方法中有源碼如下;源碼說明:創(chuàng)建的線程將從任務(wù)隊列中獲取一個新的任務(wù),在keepAliveTime時間之后如果還未獲取到任務(wù),將關(guān)閉該線程;

 

unit :設(shè)置線程池線程存活時間的時間單位;

workQueue :設(shè)置線程池用于存放任務(wù)的隊列;

注意:ThreadPoolExecutor線程池是否創(chuàng)建新的線程不僅僅依賴于corePoolSize變量,還依賴于任務(wù)隊列的offer(E) 方法所返回的值;比如:想要創(chuàng)建一個cache線程池,就依賴于一個特殊的任務(wù)隊列:SynchronousQueue<E>;

源碼佐證,ThreadPoolExecutor 的execute(Runnable) 方法中有源碼如下:

示例: 創(chuàng)建固定線程池 和 cache線程池;

固定線程池,將corePoolSize 和 maximumPoolSize 設(shè)置相同即可,在Executors.newFixedThreadPool(10)有源碼示例:

 public static ExecutorService newFixedThreadPool(int nThreads) {
  return new ThreadPoolExecutor(nThreads, nThreads,
          0L, TimeUnit.MILLISECONDS,
          new LinkedBlockingQueue<Runnable>());
 }

cacahe線程池,需要傳入特殊的BlockingQueue對象,該對象需要在offer是返回false,并能夠在poll方法中監(jiān)聽到offer進(jìn)入的任務(wù);java 提供了一個SynchronousQueue類,該類就是這樣一個對象;在Executors.newCachedThreadPool()方法中,有源碼示例:

 public static ExecutorService newCachedThreadPool() {
  return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
          60L, TimeUnit.SECONDS,
          new SynchronousQueue<Runnable>());
 }

常用方法提示:

  void execute(Runnable command) : 任務(wù)提交方法;線程池將順序執(zhí)行所提交的所有方法;

  void shutdown() : 停止后續(xù)任務(wù)提交,但執(zhí)行完當(dāng)前線程池中所有任務(wù);該方法的作用:線程池將中斷當(dāng)前所有空閑的線程,但不保證一定中斷(可查看Thread的interrupt方法);那么工作中的線程將繼續(xù)工作,直到完成;

源碼:

public void shutdown() {
  final ReentrantLock mainLock = this.mainLock;
  mainLock.lock();
  try {
   checkShutdownAccess();
   advanceRunState(SHUTDOWN);
   interruptIdleWorkers(); 、//中斷所有空閑的線程
   onShutdown(); // hook for ScheduledThreadPoolExecutor
  } finally {
   mainLock.unlock();
  }
  tryTerminate();
 }

  List<Runnable> shutdownNow() : 立即終止線程池;該方法的作用:線程池將中斷所有創(chuàng)建的線程,但不保存一定中斷;線程池將所有剩余的任務(wù)從任務(wù)隊列中移除,不在執(zhí)行,并保存在一個List中返回給用于;

方法源碼:

public List<Runnable> shutdownNow() {
  List<Runnable> tasks;
  final ReentrantLock mainLock = this.mainLock;
  mainLock.lock();
  try {
   checkShutdownAccess();
   advanceRunState(STOP);
   interruptWorkers();
   tasks = drainQueue();
  } finally {
   mainLock.unlock();
  }
  tryTerminate();
  return tasks;
 }

ThreadPoolExecutor 任務(wù)執(zhí)行流程圖:

  

ThreadPoolExecutor 使用注意點說明:

清晰需要使用的是那種類型的線程池,在實例化ThreadPoolExecutor時,傳入的參數(shù)不同創(chuàng)建出來的線程池也將不同;尤其注意傳入BlockingQueue參數(shù),如果需要使用cache線程池,請確保BlockingQueue的offer方法反回false;可以參見SynchronousQueue類;

總結(jié):

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • SpringBoot獲取application.properties文件中文亂碼問題及解決

    SpringBoot獲取application.properties文件中文亂碼問題及解決

    這篇文章主要介紹了SpringBoot獲取application.properties文件中文亂碼問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 詳解SpringBoot結(jié)合swagger2快速生成簡單的接口文檔

    詳解SpringBoot結(jié)合swagger2快速生成簡單的接口文檔

    這篇文章主要介紹了詳解SpringBoot結(jié)合swagger2快速生成簡單的接口文檔,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • SpringBoot實現(xiàn)單元測試示例詳解

    SpringBoot實現(xiàn)單元測試示例詳解

    單元測試(unit testing),是指對軟件中的最小可測試單元進(jìn)行檢查和驗證。這篇文章主要為大家介紹了C語言實現(xiàn)單元測試的方法,需要的可以參考一下
    2022-11-11
  • Java遍歷并刪除Map的四種方法對比

    Java遍歷并刪除Map的四種方法對比

    在Java中,遍歷并刪除?Map?中的元素有四種常見的方法,每種方法都有其適用場景和優(yōu)缺點,下面小編就來和大家詳細(xì)介紹一下這幾種方法的具體實現(xiàn)吧
    2024-10-10
  • Mybatis分頁查詢的實現(xiàn)(Rowbounds和PageHelper)

    Mybatis分頁查詢的實現(xiàn)(Rowbounds和PageHelper)

    本文主要介紹了Mybatis分頁查詢的實現(xiàn)(Rowbounds和PageHelper),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 詳解Java 自動裝箱與自動拆箱

    詳解Java 自動裝箱與自動拆箱

    這篇文章主要介紹了Java 自動裝箱與自動拆箱的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • 怎樣給Kafka新增分區(qū)

    怎樣給Kafka新增分區(qū)

    這篇文章主要介紹了怎樣給Kafka新增分區(qū)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java實現(xiàn)的簡單網(wǎng)頁截屏功能示例

    Java實現(xiàn)的簡單網(wǎng)頁截屏功能示例

    這篇文章主要介紹了Java實現(xiàn)的簡單網(wǎng)頁截屏功能,涉及java網(wǎng)頁打開及屏幕截圖功能相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • 詳解ConcurrentHashMap如何保證線程安全及底層實現(xiàn)原理

    詳解ConcurrentHashMap如何保證線程安全及底層實現(xiàn)原理

    這篇文章主要為大家介紹了ConcurrentHashMap如何保證線程安全及底層實現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 源碼解析JDK 1.8 中的 Map.merge()

    源碼解析JDK 1.8 中的 Map.merge()

    這篇文章主要介紹了JDK 1.8 之 Map.merge()的相關(guān)知識,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10

最新評論