android--執行緒池
使用執行緒池主要基於這樣的需求,因為建立一個執行緒因為涉及到與作業系統的互動,所以成本較高。當程式中需要大量而短暫的執行緒時應考慮使用執行緒池。
執行緒池工具類,轉自 http://www.cnblogs.com/answer1991/archive/2012/04/22/2464524.html
package com.chenjun.utils;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 執行緒池輔助類,整個應用程式就只有一個執行緒池去管理執行緒。
* 可以設定核心執行緒數、最大執行緒數、額外執行緒空狀態生存時間,阻塞佇列長度來優化執行緒池。
* 下面的資料都是參考Android的AsynTask裡的資料。
* @author zet
*
*/
public class ThreadPoolUtils {
private ThreadPoolUtils(){
}
//執行緒池核心執行緒數
private static int CORE_POOL_SIZE = 5;
//執行緒池最大執行緒數
private static int MAX_POOL_SIZE = 100;
//額外執行緒空狀態生存時間
private static int KEEP_ALIVE_TIME = 10000;
//阻塞佇列。當核心執行緒都被佔用,且阻塞佇列已滿的情況下,才會開啟額外執行緒。
private static BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(
10);
//執行緒工廠
private static ThreadFactory threadFactory = new ThreadFactory() {
private final AtomicInteger integer = new AtomicInteger();
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "myThreadPool thread:" + integer.getAndIncrement());
}
};
//執行緒池
private static ThreadPoolExecutor threadPool;
static {
threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE,
MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, workQueue,
threadFactory);
}
/**
* 從執行緒池中抽取執行緒,執行指定的Runnable物件
* @param runnable
*/
public static void execute(Runnable runnable){
threadPool.execute(runnable);
}
}
使用:
ThreadPoolUtils.execute(new Runnable(){});
擴充套件,如果要進行取消操作:
將Runnable物件再進行封裝成FutureTask。
FutureTask<Void> myTask = new FutureTask<Void>(new MyRunnable(), new Void());
ThreadPoolUtils.execute(myTask);
如果需要取消的話,myTask.cancel(true)。
ThreadPoolExecutor類:
- public ThreadPoolExecutor(int corePoolSize,
- int maximumPoolSize,
- long keepAliveTime,
- TimeUnit unit,
- BlockingQueue<Runnable> workQueue,
- ThreadFactory threadFactory,
- RejectedExecutionHandler handler)
看這個引數很容易讓人以為是執行緒池裡保持corePoolSize個執行緒,如果不夠用,就加執行緒入池直至maximumPoolSize大小,如果還不夠就往workQueue里加,如果workQueue也不夠就用RejectedExecutionHandler來做拒絕處理。
但實際情況不是這樣,具體流程如下:
1)當池子大小小於corePoolSize就新建執行緒,並處理請求
2)當池子大小等於corePoolSize,把請求放入workQueue中,池子裡的空閒執行緒就去從workQueue中取任務並處理
3)當workQueue放不下新入的任務時,新建執行緒入池,並處理請求,如果池子大小撐到了maximumPoolSize就用RejectedExecutionHandler來做拒絕處理
4)另外,當池子的執行緒數大於corePoolSize的時候,多餘的執行緒會等待keepAliveTime長的時間,如果無請求可處理就自行銷燬
相關:
http://blog.csdn.net/cutesource/article/details/6061229
http://www.cnblogs.com/answer1991/archive/2012/04/22/2464524.html
相關文章
- Java執行緒池二:執行緒池原理Java執行緒
- 淺談執行緒池(上):執行緒池的作用及CLR執行緒池執行緒
- 執行緒和執行緒池執行緒
- 多執行緒【執行緒池】執行緒
- 執行緒 執行緒池 Task執行緒
- 執行緒池執行緒
- 淺談執行緒池(中):獨立執行緒池的作用及IO執行緒池執行緒
- Java多執行緒——執行緒池Java執行緒
- java執行緒池趣味事:這不是執行緒池Java執行緒
- 執行緒池以及四種常見執行緒池執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 二. 執行緒管理之執行緒池執行緒
- kuangshenshuo-多執行緒-執行緒池執行緒
- 執行緒的建立及執行緒池執行緒
- JavaThread多執行緒執行緒池Javathread執行緒
- Java多執行緒18:執行緒池Java執行緒
- 多執行緒之手撕執行緒池執行緒
- 執行緒池管理(1)-為什麼需要執行緒池執行緒
- 執行緒與執行緒池的那些事之執行緒池篇(萬字長文)執行緒
- 執行緒池 Executor執行緒
- Java執行緒池Java執行緒
- java 執行緒池Java執行緒
- 再聊執行緒池執行緒
- 執行緒池原理執行緒
- Ruby執行緒池執行緒
- Android多執行緒之執行緒池Android執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 執行緒池建立執行緒的過程執行緒
- Java執行緒池一:執行緒基礎Java執行緒
- Android的執行緒和執行緒池Android執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- java多執行緒系列之執行緒池Java執行緒
- golang workpool,工作池,執行緒池Golang執行緒
- 執行緒執行順序——CountDownLatch、CyclicBarrier 、join()、執行緒池執行緒CountDownLatch
- 執行緒池之ThreadPoolExecutor執行緒池原始碼分析筆記執行緒thread原始碼筆記
- 執行緒池之ScheduledThreadPoolExecutor執行緒池原始碼分析筆記執行緒thread原始碼筆記
- 原始碼|從序列執行緒封閉到物件池、執行緒池原始碼執行緒物件