中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android多線程中線程池ThreadPool的示例分析

發布時間:2021-08-12 09:34:27 來源:億速云 閱讀:184 作者:小新 欄目:移動開發

小編給大家分享一下Android多線程中線程池ThreadPool的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

目錄

Android多線程中線程池ThreadPool的示例分析

1. 簡介

Android多線程中線程池ThreadPool的示例分析

2. 工作原理

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

Android多線程中線程池ThreadPool的示例分析

上述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 內部原理邏輯

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

Android多線程中線程池ThreadPool的示例分析

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. 創建定長線程池對象 & 設置線程池線程數量固定為3
ExecutorService 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. 創建 定時線程池對象 & 設置線程池線程數量固定為5
ScheduledExecutorService 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 常見線程池 總結 & 對比

Android多線程中線程池ThreadPool的示例分析

以上是“Android多線程中線程池ThreadPool的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和硕县| 民勤县| 敖汉旗| 房山区| 宜城市| 县级市| 石景山区| 独山县| 东方市| 临澧县| 淄博市| 锡林浩特市| 台中市| 桐城市| 奎屯市| 凤台县| 余庆县| 沈阳市| 湘乡市| 霍城县| 尚义县| 启东市| 四会市| 临夏县| 龙胜| 扬中市| 根河市| 高邮市| 抚州市| 江西省| 牡丹江市| 丰城市| 宝山区| 沁源县| 神木县| 泌阳县| 阳朔县| 石楼县| 雷山县| 呼和浩特市| 合水县|