小編給大家分享一下Android多線程中線程池ThreadPool的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
軹城網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、成都響應式網(wǎng)站建設公司等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)。
目錄
1. 簡介
2. 工作原理
2.1 核心參數(shù)線程池中有6個核心參數(shù),具體如下
上述6個參數(shù)的配置 決定了 線程池的功能,具體設置時機 = 創(chuàng)建 線程池類對象時 傳入
ThreadPoolExecutor類 = 線程池的真正實現(xiàn)類
開發(fā)者可根據(jù)不同需求 配置核心參數(shù),從而實現(xiàn)自定義線程池
// 創(chuàng)建線程池對象如下 // 通過 構造方法 配置核心參數(shù) Executor executor = new ThreadPoolExecutor( CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory ); // 構造函數(shù)源碼分析 public ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable workQueue>, ThreadFactory threadFactory )
注:Java 里已內(nèi)置4種常用的線程池(即 已經(jīng)配置好核心參數(shù)),下面會詳細說明
2.2 內(nèi)部原理邏輯
當線程池運行時,遵循以下工作邏輯
3. 使用流程
線程池的使用流程如下
// 1. 創(chuàng)建線程池 // 創(chuàng)建時,通過配置線程池的參數(shù),從而實現(xiàn)自己所需的線程池 Executor threadPool = new ThreadPoolExecutor( CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory ); // 注:在Java中,已內(nèi)置4種常見線程池,下面會詳細說明 // 2. 向線程池提交任務:execute() // 說明:傳入 Runnable對象 threadPool.execute(new Runnable() { @Override public void run() { ... // 線程執(zhí)行任務 } }); // 3. 關閉線程池shutdown() threadPool.shutdown(); // 關閉線程的原理 // a. 遍歷線程池中的所有工作線程 // b. 逐個調(diào)用線程的interrupt()中斷線程(注:無法響應中斷的任務可能永遠無法終止) // 也可調(diào)用shutdownNow()關閉線程:threadPool.shutdownNow() // 二者區(qū)別: // shutdown:設置 線程池的狀態(tài) 為 SHUTDOWN,然后中斷所有沒有正在執(zhí)行任務的線程 // shutdownNow:設置 線程池的狀態(tài) 為 STOP,然后嘗試停止所有的正在執(zhí)行或暫停任務的線程,并返回等待執(zhí)行任務的列表 // 使用建議:一般調(diào)用shutdown()關閉線程池;若任務不一定要執(zhí)行完,則調(diào)用shutdownNow()
4. 常見的4類功能線程池
根據(jù)參數(shù)的不同配置,Java中最常見的線程池有4類:
定長線程池(FixedThreadPool)定時線程池(ScheduledThreadPool )可緩存線程池(CachedThreadPool)單線程化線程池(SingleThreadExecutor)
即 對于上述4類線程池,Java已根據(jù) 應用場景 配置好核心參數(shù)
4.1 定長線程池(FixedThreadPool)特點:只有核心線程 & 不會被回收、線程數(shù)量固定、任務隊列無大小限制(超出的線程任務會在隊列中等待)應用場景:控制線程最大并發(fā)數(shù)具體使用:通過 Executors.newFixedThreadPool() 創(chuàng)建示例:
// 1. 創(chuàng)建定長線程池對象 & 設置線程池線程數(shù)量固定為3 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); // 2. 創(chuàng)建好Runnable類線程對象 & 需執(zhí)行的任務 Runnable task =new Runnable(){ public void run(){ System.out.println("執(zhí)行任務啦"); } }; // 3. 向線程池提交任務:execute() fixedThreadPool.execute(task); // 4. 關閉線程池 fixedThreadPool.shutdown();
4.2 定時線程池(ScheduledThreadPool )特點:核心線程數(shù)量固定、非核心線程數(shù)量無限制(閑置時馬上回收)應用場景:執(zhí)行定時 / 周期性 任務使用:通過Executors.newScheduledThreadPool()創(chuàng)建示例:
// 1. 創(chuàng)建 定時線程池對象 & 設置線程池線程數(shù)量固定為5 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); // 2. 創(chuàng)建好Runnable類線程對象 & 需執(zhí)行的任務 Runnable task =new Runnable(){ public void run(){ System.out.println("執(zhí)行任務啦"); } }; // 3. 向線程池提交任務:schedule() scheduledThreadPool.schedule(task, 1, TimeUnit.SECONDS); // 延遲1s后執(zhí)行任務 scheduledThreadPool.scheduleAtFixedRate(task,10,1000,TimeUnit.MILLISECONDS);// 延遲10ms后、每隔1000ms執(zhí)行任務 // 4. 關閉線程池 scheduledThreadPool.shutdown();
4.3 可緩存線程池(CachedThreadPool)特點:只有非核心線程、線程數(shù)量不固定(可無限大)、靈活回收空閑線程(具備超時機制,全部回收時幾乎不占系統(tǒng)資源)、新建線程(無線程可用時)
任何線程任務到來都會立刻執(zhí)行,不需要等待
應用場景:執(zhí)行大量、耗時少的線程任務 使用:通過Executors.newCachedThreadPool()創(chuàng)建 示例:
// 1. 創(chuàng)建可緩存線程池對象 ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // 2. 創(chuàng)建好Runnable類線程對象 & 需執(zhí)行的任務 Runnable task =new Runnable(){ public void run(){ System.out.println("執(zhí)行任務啦"); } }; // 3. 向線程池提交任務:execute() cachedThreadPool.execute(task); // 4. 關閉線程池 cachedThreadPool.shutdown(); //當執(zhí)行第二個任務時第一個任務已經(jīng)完成 //那么會復用執(zhí)行第一個任務的線程,而不用每次新建線程。
4.4 單線程化線程池(SingleThreadExecutor)
特點:只有一個核心線程(保證所有任務按照指定順序在一個線程中執(zhí)行,不需要處理線程同步的問題)
應用場景:不適合并發(fā)但可能引起IO阻塞性及影響UI線程響應的操作,如數(shù)據(jù)庫操作,文件操作等
使用:通過Executors.newSingleThreadExecutor()創(chuàng)建示例:
// 1. 創(chuàng)建單線程化線程池 ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); // 2. 創(chuàng)建好Runnable類線程對象 & 需執(zhí)行的任務 Runnable task =new Runnable(){ public void run(){ System.out.println("執(zhí)行任務啦"); } }; // 3. 向線程池提交任務:execute() singleThreadExecutor.execute(task); // 4. 關閉線程池 singleThreadExecutor.shutdown();
4.5 常見線程池 總結 & 對比
以上是“Android多線程中線程池ThreadPool的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文題目:Android多線程中線程池ThreadPool的示例分析
分享地址:http://jinyejixie.com/article38/ppeipp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、App設計、面包屑導航、網(wǎng)站建設、手機網(wǎng)站建設、虛擬主機
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)