国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

完全解析Android多線程中線程池ThreadPool的原理和使用

2019-12-12 00:58:32
字體:
來源:轉載
供稿:網友

前言對于多線程,大家應該很熟悉。但是,大家了解線程池嗎?今天,我將帶大家全部學習關于線程池的所有知識。

目錄

示意圖

1. 簡介

示意圖

2. 工作原理

2.1 核心參數線程池中有6個核心參數,具體如下

示意圖

上述6個參數的配置 決定了 線程池的功能,具體設置時機 = 創建 線程池類對象時 傳入

ThreadPoolExecutor類 = 線程池的真正實現類
開發者可根據不同需求 配置核心參數,從而實現自定義線程池
// 創建線程池對象如下// 通過 構造方法 配置核心參數  Executor executor = new ThreadPoolExecutor(                        CORE_POOL_SIZE,                       MAXIMUM_POOL_SIZE,                       KEEP_ALIVE,                       TimeUnit.SECONDS,                        sPoolWorkQueue,                       sThreadFactory                         );// 構造函數源碼分析  public ThreadPoolExecutor (int corePoolSize,                int maximumPoolSize,                long keepAliveTime,                TimeUnit unit,                BlockingQueue<Runnable workQueue>,                ThreadFactory threadFactory )

注:Java 里已內置4種常用的線程池(即 已經配置好核心參數),下面會詳細說明

2.2 內部原理邏輯

當線程池運行時,遵循以下工作邏輯

示意圖

3. 使用流程

線程池的使用流程如下

// 1. 創建線程池  // 創建時,通過配置線程池的參數,從而實現自己所需的線程池  Executor threadPool = new ThreadPoolExecutor(                       CORE_POOL_SIZE,                       MAXIMUM_POOL_SIZE,                       KEEP_ALIVE,                       TimeUnit.SECONDS,                       sPoolWorkQueue,                       sThreadFactory                       );  // 注:在Java中,已內置4種常見線程池,下面會詳細說明// 2. 向線程池提交任務:execute()  // 說明:傳入 Runnable對象    threadPool.execute(new Runnable() {      @Override      public void run() {        ... // 線程執行任務      }    });// 3. 關閉線程池shutdown()  threadPool.shutdown(); // 關閉線程的原理 // a. 遍歷線程池中的所有工作線程 // b. 逐個調用線程的interrupt()中斷線程(注:無法響應中斷的任務可能永遠無法終止) // 也可調用shutdownNow()關閉線程:threadPool.shutdownNow() // 二者區別: // shutdown:設置 線程池的狀態 為 SHUTDOWN,然后中斷所有沒有正在執行任務的線程 // shutdownNow:設置 線程池的狀態 為 STOP,然后嘗試停止所有的正在執行或暫停任務的線程,并返回等待執行任務的列表 // 使用建議:一般調用shutdown()關閉線程池;若任務不一定要執行完,則調用shutdownNow()

4. 常見的4類功能線程池

根據參數的不同配置,Java中最常見的線程池有4類:

定長線程池(FixedThreadPool)定時線程池(ScheduledThreadPool )可緩存線程池(CachedThreadPool)單線程化線程池(SingleThreadExecutor)

即 對于上述4類線程池,Java已根據 應用場景 配置好核心參數

4.1 定長線程池(FixedThreadPool)特點:只有核心線程 & 不會被回收、線程數量固定、任務隊列無大小限制(超出的線程任務會在隊列中等待)應用場景:控制線程最大并發數具體使用:通過 Executors.newFixedThreadPool() 創建示例:

// 1. 創建定長線程池對象 & 設置線程池線程數量固定為3ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);// 2. 創建好Runnable類線程對象 & 需執行的任務Runnable task =new Runnable(){ public void run(){  System.out.println("執行任務啦");   }  };// 3. 向線程池提交任務:execute()fixedThreadPool.execute(task);// 4. 關閉線程池fixedThreadPool.shutdown();

4.2 定時線程池(ScheduledThreadPool )特點:核心線程數量固定、非核心線程數量無限制(閑置時馬上回收)應用場景:執行定時 / 周期性 任務使用:通過Executors.newScheduledThreadPool()創建示例:

// 1. 創建 定時線程池對象 & 設置線程池線程數量固定為5ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);// 2. 創建好Runnable類線程對象 & 需執行的任務Runnable task =new Runnable(){    public void run(){       System.out.println("執行任務啦");     }  };// 3. 向線程池提交任務:schedule()scheduledThreadPool.schedule(task, 1, TimeUnit.SECONDS); // 延遲1s后執行任務scheduledThreadPool.scheduleAtFixedRate(task,10,1000,TimeUnit.MILLISECONDS);// 延遲10ms后、每隔1000ms執行任務// 4. 關閉線程池scheduledThreadPool.shutdown();

4.3 可緩存線程池(CachedThreadPool)特點:只有非核心線程、線程數量不固定(可無限大)、靈活回收空閑線程(具備超時機制,全部回收時幾乎不占系統資源)、新建線程(無線程可用時)

任何線程任務到來都會立刻執行,不需要等待

應用場景:執行大量、耗時少的線程任務 使用:通過Executors.newCachedThreadPool()創建 示例:

// 1. 創建可緩存線程池對象ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 2. 創建好Runnable類線程對象 & 需執行的任務Runnable task =new Runnable(){ public void run(){    System.out.println("執行任務啦");      }  };// 3. 向線程池提交任務:execute()cachedThreadPool.execute(task);// 4. 關閉線程池cachedThreadPool.shutdown();//當執行第二個任務時第一個任務已經完成//那么會復用執行第一個任務的線程,而不用每次新建線程。

4.4 單線程化線程池(SingleThreadExecutor)

特點:只有一個核心線程(保證所有任務按照指定順序在一個線程中執行,不需要處理線程同步的問題)

應用場景:不適合并發但可能引起IO阻塞性及影響UI線程響應的操作,如數據庫操作,文件操作等

使用:通過Executors.newSingleThreadExecutor()創建示例:

// 1. 創建單線程化線程池ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();// 2. 創建好Runnable類線程對象 & 需執行的任務Runnable task =new Runnable(){ public void run(){    System.out.println("執行任務啦");      }  };// 3. 向線程池提交任務:execute()singleThreadExecutor.execute(task);// 4. 關閉線程池singleThreadExecutor.shutdown();

4.5 常見線程池 總結 & 對比

示意圖

5. 總結閱讀本文后,相信你已經非常了解線程池 & 用法接下來,我會繼續講解Android開發中關于多線程的知識,具體包括Thread類、Handler、HandlerThread等等,有興趣可以繼續關注Carson_Ho的安卓開發筆記請幫頂 / 評論點贊!因為你的鼓勵是我寫作的最大動力!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通城县| 西城区| 太白县| 玉山县| 内黄县| 秭归县| 梁山县| 宁夏| 延庆县| 万源市| 育儿| 泰来县| 民和| 长宁县| 宣化县| 武清区| 松阳县| 保亭| 汶川县| 铜川市| 白山市| 五华县| 石泉县| 无锡市| 哈巴河县| 黄冈市| 庆城县| 云龙县| 武定县| 天水市| 阜平县| 肃北| 长顺县| 忻城县| 上虞市| 丰原市| 呼伦贝尔市| 宁蒗| 乌苏市| 宜丰县| 新泰市|