1. 程式人生 > >Android多執行緒(一)執行緒池

Android多執行緒(一)執行緒池

1.  new Thread 

new Thread(new Runnable() {    
    @Override  
    public void run() {  
        // TODO Auto-generated method stub  
    }  
}).start();  


這是最基本的開啟執行緒的方式(實現Runnable介面),我們在初學安卓或者早期開發安卓的開發者們都是用這種方法去開啟執行緒的,此外還有兩種方式去開啟執行緒:繼承Thread類重寫run()方法 和 實現Callable介面,重寫 call()方法,這裡就不做介紹了。

但是上面的三種開啟執行緒的方法在我們編寫android應用時會有以下的弊端:

1.但是我們都知道java執行緒機制是搶佔性質的,排程機會中斷執行緒,將上下文切換到另一個執行緒,從而為每個執行緒都提供時間片,使得每個執行緒都會分配合理的時間去驅動它的任務,java提供了改變執行緒優先順序的方法,但是這會非常難以維護,試圖去操縱執行緒優先順序通常是錯誤的。

2. 每次開啟執行緒建立Thread,銷燬執行緒效能會是很差的

3 .而且這三種開啟執行緒的方法缺乏更多功能,如定時執行、定期執行、執行緒中斷。

我們在寫程式時如果是開啟執行緒數量比較少時確實可以用這種方法,但是如果有很多開啟執行緒的操作的話就不建議這麼做了。

2、Java 執行緒池
Java通過Executors提供四種執行緒池,分別為:
CachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。線上程空閒60秒後終止執行緒。
FixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。
ScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。
SingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。

Executors類用於管理Thread物件,簡化併發過程,我們可以看到FixedThreadPool的建立過程:

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

顯然這四種執行緒池方法都是返回實現了ExecutorService介面的ThreadPoolExecutor。當然我們也可以直接用ThreadPoolExecutor來自定義更靈活的執行緒池。

我們先看看ThreadPoolExecutor的構建引數:

public ThreadPoolExecutor(int corePoolSize,  
                         int maximumPoolSize,  
                        long keepAliveTime,  
                        TimeUnit unit,  
                         BlockingQueue<Runnable> workQueue,  
                        ThreadFactory threadFactory,  
                          RejectedExecutionHandler handler) 

當池子大小小於corePoolSize就新建執行緒,並處理請求,當池子大小大於corePoolSize,把請求放入workQueue中,池子裡的空閒執行緒就去從workQueue中取任務並處理,當workQueue放不下新入的任務時,新建執行緒入池,並處理請求,如果池子大小撐到了maximumPoolSize就用RejectedExecutionHandler來做拒絕處理。另外,當池子的執行緒數大於corePoolSize的時候,多餘的執行緒會等待keepAliveTime長的時間,如果無請求可處理就自行銷燬


 接下來我們來看看CachedThreadPool:

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

CachedThreadPool在程式執行時會建立與所需數量相同的執行緒,然後在它回收舊執行緒時停止建立新執行緒,因此是Executor的首選,只有當這種方式會引發問題,或者不符合業務需要時才採用另外的三種Executor提供的執行緒池

SingleThreadExecutor 就是執行緒數量為1的FixedThreadPool,如果向SingleThreadExecutor提交多個任務,那麼這些任務會排隊,每個任務都會在下個任務開始之前就結束,所有任務都用一個執行緒,並且按照提交的順序執行。

 執行緒池用於執行緒數量比較多時的場景,如果只開啟2,3個執行緒就用執行緒池,顯然會極度的浪費資源



相關推薦

Android執行()執行

1.  new Thread  new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub

Java執行()執行基礎

1.執行緒與程序 程序: 是併發執行的程式在執行過程中分配和管理資源的基本單位,是一個動態概念,程序是系統中獨立存在的實體,擁有自己獨立的資源,擁有自己私有的地址空間。程序的實質,就是程式在多道程式系統中的一次執行過程,它是動態產生,動態消亡的,具有自己的生命週

執行()執行建立的三種方式

建立執行緒的三種方式: 1.第一種方式繼承Thread類,重寫Thread類中的run方法,還需要呼叫start方法,start方法相當於通知CPU,執行緒已經就緒,CPU在合適的時間點呼叫該執行緒的run方法;我們程式中的main方法,我們稱之為主執行緒。 2.建立執行緒的第二種方式,實現Runnabl

執行()——執行執行,Task概念+程式碼實踐

# 執行緒(一)——執行緒,執行緒池,Task概念+程式碼實踐 [toc] ## 摘要 執行緒中的概念很多,如果沒有程式碼示例來理解,會比較晦澀,而且有些概念落不到實處,因此,本文以一些執行示例程式碼,結果來闡述執行緒中的一些基礎概念。讓自己跟讀者一起把執行緒中的概念理解地更深刻。 ## 1 執行緒安

C# 本程序執行完畢後再執行執行

  最近做了一套MES整合系統,由上料到成品使自動化執行,其中生產過程是逐步的,但是每一個動作都需要獨立的執行緒進行資料監聽,那麼就需要實現執行緒等待。 程式碼: using System; using System.Collections.Generic; using System.Compone

Android程序總結:生成程序(android:process屬性)

前言 正常情況下,一個apk啟動後只會執行在一個程序中,其程序名為apk的包名,所有的元件都會在這個程序中執行,以下為DDMS的程序截圖: com.biyou.multiprocess為程序名,也是apk的包名,  但是如果需要將某些元件(如Service,Activity等)執行在單

Android程序理解

一、Java程序和執行緒 程序是作業系統進行資源分配和排程的一個獨立單位。  獨立性(每個程序都有自己獨立私有的一塊記憶體空間)、動態性、併發性(多個程序可在單處理器上併發執行) 併發是指在同一時間點只能有一條指令執行,但多個程序指令被快速輪換執行,使得在巨集觀上具有多

Android執行操作sqlite資料庫連線框架的種設計思路

我們在Android應用程式開發當中經常會用到資料庫,一般在有兩種主要開發思路。 第一種:每次需要對資料庫操作的時候建立連線,操作完成後,馬上關閉連線。 這個方式一般用於不怎麼頻繁操作資料庫的情況,用完後馬上關閉達到節省系統資源的目的。 第二種:應用程式一

Android面試題總結(四)執行執行執行

1.開啟執行緒的三中方式?https://blog.csdn.net/longshengguoji/article/details/41126119(轉)https://blog.csdn.net/u012973218/article/details/51280044(轉)2

Android執行執行

前言,學習安卓很久了,一直也沒有學部落格的習慣,下決心從今天開始要養成寫部落格總結學習經驗的好習慣! 一.Android中執行緒與執行緒池的簡介 在Android中執行緒主要可以分為兩大類:一個用於處理介面相關與使用者互動的執行緒-主執行緒;一個用於處理耗時任務-子執行緒

Android 執行 執行原理 封裝執行

我自己理解看來。執行緒池顧名思義就是一個容器的意思,需要注意的是,每一個執行緒都是需要CPU分配資源去執行的。如果由於總是new Thread()開啟一個執行緒,那麼就會大量的消耗CPU的資源,導致Android執行變慢,甚至OOM(out of memory),因而J

Android執行之()View.post()原始碼分析——在子執行中更新UI

       提起View.post(),相信不少童鞋一點都不陌生,它用得最多的有兩個功能,使用簡便而且實用:        1)在子執行緒中更新UI。從子執行緒中切換到主執行緒更新UI,不需要額外new一個Handler例項來實

化技術到達有牛?看了執行執行的對比嚇我跳!

情商高的人是能洞察並照顧到身邊所有人的情緒,而好的文章應該是讓所有人都能看懂。 **尼采曾經說過:人們無法理解他沒有經歷過的事情**。因此我會試著把技術文章寫的儘量具象化一些,力求讓所有人都能看懂,所以在正式開始之前,我們先從兩個生活事例說起。 尼采帥照: ![image.png](https://cdn

JAVA執行(三) 執行和鎖的深度化

 github演示程式碼地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/src/main/java/com/kawa/thread 1.執行緒池  1.1 執行緒池是什麼 Java中的執行緒

Android執行分析之一:使用Thread非同步下載影象

Android多執行緒分析之一:使用Thread非同步下載影象 羅朝輝 (http://blog.csdn.net/kesalin) CC 許可,轉載請註明出處 打算整理一下對 Android Framework 中多執行緒相關知識的理解,主要集中在 Fra

執行執行

1、好處 第一:降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。 第二:提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。 第三:提高執行緒的可管理性。執行緒是稀缺資源,如果無限制地建立,不僅會消耗系統資源, 還會降低系統的穩定性,使用執行

執行學習----執行(九)

1.固定執行緒池 建立一個執行緒池,裡邊放三個執行緒,建立十個任務,讓三個執行緒誰有空閒誰去執行這十個任務,直到任務結束。 public class ThreadPoolStudy { public static void main(String[] args) { //建

執行學習---執行鎖的應用(十)

Lock比傳統執行緒模型中的synchronized方式更加面向物件,與生活中的鎖類似,鎖本身也應該是一個物件。兩個執行緒執行的程式碼片段要實現同步互斥的效果,它們必須使用同一個Lock物件。鎖是上在代表要操作資源的類的內部方法中,而不是執行緒的程式碼中! 示例程式碼: public c

Android執行理解

Android 理解多執行緒 安卓應用程式通常是應用在一個單獨的執行緒裡的,即為主執行緒,用於顯示使用者介面以及響應使用者的操作。 如果一些耗時任務也同時在主執行緒裡去完成,則會影響使用者體驗,會阻塞UI主執行緒。我們會建立一個單獨的執行緒或者子執行緒,去處理這些耗時操作(如網路請求、

android執行斷點下載

多執行緒斷電xia下載,通過設定執行緒的數量,動態獲取下載檔案執行緒的個數,這是本人用於練習所寫demo,註釋很詳細,用於初學者參考使用。 MainActivity.java頁面   package com.dahui.download; import java.io.Buf