Android中使用執行緒池來管理執行緒
背景:每出現一個耗時操作都去建立一個新的執行緒必然不優美,既沒有高併發,對資源的共享和競爭也是比較混亂。總之:
a. 每次new Thread新建物件效能差。
b. 執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭,及可能佔用過多系統資源導致宕機或oom。
c. 缺乏更多功能,如定時執行、定期執行、執行緒中斷。
相比new Thread,Java提供的四種執行緒池的好處在於:
a. 重用存在的執行緒,減少物件建立、消亡的開銷,效能佳。
b. 可有效控制最大併發執行緒數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。
c. 提供定時執行、定期執行、單執行緒、併發數控制等功能。
一、newCacheThreadPool一個無限大並可以快取的執行緒池。在之前建立新執行緒的時刻首先複用已經建立過的空閒執行緒。
ExecutorService cacheThreadPool = Executors.newCachedThreadPool();
for ( int i = 0 ; i<10 ; i++ ){
final int index = i;
try {
Thread.sleep(index*10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//拿到執行緒的物件的時候將執行緒扔到執行緒池中
cacheThreadPool.execute(new Runnable() {
@Override
public void run() {
Log.d( "newCachedThreadPool" , "" + index );
}
});
}
二、newFixedThreadPool 可以控制最大併發數的執行緒池。超過最大併發數的執行緒進入等待佇列。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3 );
for (int i= 0;i<10;i++){
final int index = i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
Log.d("newFixedThreadPool",index+"");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
三、newScheduledThreadPool 一個可以定時執行的執行緒池。
延時1s執行
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
Log.d("newScheduledThreadPool","延期3秒執行");
}
},3, TimeUnit.SECONDS);
延時1s後每隔3s執行一次
public void initImTimeThreadPool(){
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Log.d("newScheduledThreadPool","延時1s後每3s執行一次");
}
},1,3,TimeUnit.SECONDS);
}
四、newSingleThreadExecutor 單執行緒化執行緒池。支援FIFO、LIFO的優先順序執行。
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i<10 ;i++){
final int index = i ;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
Log.d("newSingleThreadExecutor",""+index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
那麼問題來了,以上都是講建立執行緒池並且將執行緒扔到執行緒池裡面,那麼,對於線上程池中的執行緒,我們該如何進行管理呢?
execute()方法實際上是Executor中宣告的方法,在ThreadPoolExecutor進行了具體的實現,這個方法是ThreadPoolExecutor的核心方法,
通過這個方法可以向執行緒池提交一個任務,交由執行緒池去執行。
submit()方法是在ExecutorService中宣告的方法,在AbstractExecutorService就已經有了具體的實現,
在ThreadPoolExecutor中並沒有對其進行重寫,這個方法也是用來向執行緒池提交任務的,但是它和execute()方法不同,
它能夠返回任務執行的結果,去看submit()方法的實現,會發現它實際上還是呼叫的execute()方法,
只不過它利用了Future來獲取任務執行結果(Future相關內容將在下一篇講述)。
shutdown()和shutdownNow()是用來關閉執行緒池的。
相關推薦
Android中使用執行緒池來管理執行緒
背景:每出現一個耗時操作都去建立一個新的執行緒必然不優美,既沒有高併發,對資源的共享和競爭也是比較混亂。總之: a. 每次new Thread新建物件效能差。 b. 執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭,及可能佔用過多系統資源導致宕機或oo
使用執行緒池來建立執行緒
1.如何使用執行緒池來建立執行緒? java中提供了一個靜態工廠方法來建立不同的執行緒池: Executors 通過靜態方法創建出的執行緒都實現了ExecutorService介面。常用的方法包括: newFixedThreadPool(int threads); 建立
C#執行緒篇---執行緒池如何管理執行緒(6完結篇)
C#執行緒基礎在前幾篇博文中都介紹了,現在最後來挖掘一下執行緒池的管理機制,也算為這個執行緒基礎做個完結。 我們現在都知道了,執行緒池執行緒分為工作者執行緒和I/O執行緒,他們是怎麼管理的? 對於Microsoft設計的CLR執行緒池,執行緒池會隨著CLR的每個版本的釋出,都會發生變化,很難去挖掘
執行緒池ThreadPoolExecutor分析: 執行緒池是什麼時候建立執行緒的,佇列中的任務是什麼時候取出來的?
帶著幾個問題進入原始碼分析: 執行緒池是什麼時候建立執行緒的? 任務runnable task是先放到core到maxThread之間的執行緒,還是先放到佇列? 佇列中的任務是什麼時候取出來的? 什麼時候會觸發reject策略? core到maxThread之間的執行緒什麼時候會di
Android 執行緒池模擬多執行緒併發下載任務
廢話不多,直接上原始碼 自定義一個Adapter public class MyAdapter extends BaseAdapter { private Context context; private List<Progress> list
執行緒池的管理,原始碼解析以及RejectedExecution
對於執行緒池用的也不少,但是最近還是糟了一坑。還是要深入瞭解一下執行緒池的使用,以免以後遭重 對於JavaEE專案來說,服務端專案是一直啟動著,有的時候需要非同步或者大併發的專案來的時候,就會想到使用多執行緒或者執行緒池來維護有關的執行緒。
C# 多執行緒的自動管理(執行緒池)
using System; using System.Collections; using System.Threading; namespace ThreadExample { /// <summary> /// 這是用來儲存資訊的資料結構,將作為引數被傳遞 ///
Android中端並重啟一個Thread執行緒的辦法
上一篇的試驗中,驗證了Java中斷並重啟一個Thread的辦法:http://blog.csdn.net/xzongyuan/article/details/39548113 這裡簡單的總結下(大概思路,沒除錯,可能會有錯!): MyThread.java pulbic
java執行緒池和關閉執行緒池中的執行緒
如果執行緒經常喜歡去new的話是不對的,你需要一個池子管理。 newCachedThreadPool 這個一個帶快取的執行緒池,是個可以無限大的執行緒池,新建的執行緒放倒這個池子裡,當執行緒停掉了的時候,下個個執行緒進來,可以複用這個執行緒。 newFixe
使用執行緒池來實現AsyncTask的排隊機制與拒絕策略
用imageview來實現海報牆,用ArrayBlockingQueue和ThreadPoolExecutor.DiscardOldestPolicy()來實現海報牆http請求的執行緒池的排隊策略:
C#多執行緒學習(四) 多執行緒的自動管理(執行緒池)
在多執行緒的程式中,經常會出現兩種情況: 一種情況: 應用程式中,執行緒把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應 這一般使用ThreadPool(執行緒池)來解決; 另一種情況:執行緒平時都處於休眠狀態,只是週期性地被喚醒 這一般使用Tim
ThreadLocal遇到執行緒池時, 各執行緒間的資料會互相干擾, 串來串去
最近遇到一個比較隱蔽而又簡單地問題,在使用ThreadLocal時發現出現多個執行緒中值串來串去,排查一番,確定問題為執行緒池的問題,執行緒池中的執行緒是會重複利用的,而ThreadLocal是用執行緒來做Key的所以在使用執行緒池的時候要特別注意ThreadL
Android 多執行緒 執行緒池原理 封裝執行緒池
我自己理解看來。執行緒池顧名思義就是一個容器的意思,需要注意的是,每一個執行緒都是需要CPU分配資源去執行的。如果由於總是new Thread()開啟一個執行緒,那麼就會大量的消耗CPU的資源,導致Android執行變慢,甚至OOM(out of memory),因而J
Android中Service(服務)和Thread(執行緒)的關係
一、Service(服務) Service是Android中四大元件之一,在Android開發中起到非常重要的作用,先來看一下官方對Service的定義: A is an application component that can perform long-ru
[C#] C#多執行緒學習(四) 多執行緒的自動管理(執行緒池)
Thread Pool Sample: Queuing 10 items to Thread Pool Queue to Thread Pool 0 Queue to Thread Pool 1 Queue to Thread Pool 2 Queue to Thread Pool 3 Q
執行緒池如何管理工作者執行緒
1.執行緒池的QueueUserWorkItem方法和Timer類總把工作項放入全域性佇列中2.工作者執行緒利用先進先出的原則從全域性佇列中取出工作項放入自己的本地佇列中,並處理他們3.因為多個工作者執行緒要從同時從全域性佇列中取工作項,所以會有一個執行緒同步鎖,保證所有工作
springboot中如何使用執行緒池及非同步執行緒
有一些業務需求,需要是非同步進行的,不能影響當前執行緒的執行,在spring boot中則能通過註解和配置快速實現這個。 首先寫個非同步執行緒池配置類,如下: @Configuration @EnableAsync public class AsyncC
程式設計師過關斬將--自定義執行緒池來實現文件轉碼
背景 我司在很久之前,一位很久之前的同事寫過一個文件轉圖片的服務,具體業務如下: 使用者在客戶端上傳文件,可以是ppt,word,pdf 等格式,使用者上傳完成可以在客戶端預覽上傳的文件,預覽的時候採用的是圖片形式(不要和我說用別的方式預覽,現在已經來不及了) 當用戶把文件上傳到雲端之後(阿里雲),把文件相
Android中的多程序、多執行緒
前面幾篇總結了程序、執行緒相關的知識。這裡總結下關於Android中的多程序、多執行緒及其使用。 這裡總結的Android中的多程序、多執行緒也是一個基礎,可擴充套件的很多。 Android中多程序 常見的幾種使用 Runtime.getRuntime().exec("xxx") 這個方法,呼叫
上海某小公司面試題:Java執行緒池來聊聊
《對線面試官》系列目前已經連載**11**篇啦!進度是**一週更新兩篇**,歡迎持續關注 - [【對線面試官】Java註解](https://mp.weixin.qq.com/s?__biz=MzU4NzA3MTc5Mg==&mid=2247483821&idx=1&sn=e9003