線程池的實現
線程池也許很多比較陌生 但是提到servlet每個人都知道,servlet就是用線程池來處理請求的
一個線程池由線程池管理器 工作線程 任務隊列和任務接口組成
一 線程池管理器---ThreadPoolMananger 主要負責啟動 停止工作線程/**
* 工作線程
* @author XuLiangYong
* Jul 20, 2007 3:47:52 PM
*/
public class WorkThread extends Thread{
private boolean shutdown = false;
private Queue<Task> queue;
public WorkThread(Queue<Task> queue){
this.queue = queue;
}
public void run(){
while(!shutdown){
synchronized(queue){ //獲得對象鎖 禁止其他線程訪問
if(!queue.isEmpty()){
//處理任務
Task task = queue.poll();
task.execute();
}else{
try {
queue.wait(); //釋放鎖 線程處于阻賽狀態 等待notify喚醒
} catch (InterruptedException e) {
}
}
}
}//end while
}
/**
* 調用該方法后不一定會立即結束線程, 只有在線程處于運行狀態且處理完當前任務后才結束
*/
public void shutdown(){
shutdown = true;
}
}
public interface Task {
void execute();
}
public class TestThreadPoolManager extends TestCase {
public void test(){
ThreadPoolManager pool = new ThreadPoolManager();
for(int i = 0; i < 100; i++){
pool.addTask(new SimpleTask(new MyManager(), i)); //SimpleTask實現了Task接口
}
pool.shutdown();
}
}

一個線程池由線程池管理器 工作線程 任務隊列和任務接口組成
一 線程池管理器---ThreadPoolMananger 主要負責啟動 停止工作線程
- public class ThreadPoolManager {
- private static int DEFAULT_POOL_SIZE = 4;
- private List<WorkThread> threadPool;
- private Queue<Task> taskQueue;
- private int poolSize;
- public ThreadPoolManager(){
- this(DEFAULT_POOL_SIZE);
- }
- public ThreadPoolManager(int poolSize){
- if(poolSize <= 0){
- this.poolSize = DEFAULT_POOL_SIZE;
- }else{
- this.poolSize = poolSize;
- }
- threadPool = new ArrayList<WorkThread>(this.poolSize);
- taskQueue = new ConcurrentLinkedQueue<Task>();
- startup();
- }
- /**
- * 啟動線程池 開始處理任務
- */
- private void startup(){
- System.out.println("啟動工作線程。。。");
- synchronized(taskQueue){
- for(int i = 0; i < DEFAULT_POOL_SIZE; i++){
- WorkThread workThread = new WorkThread(taskQueue);
- threadPool.add( workThread );
- workThread.start();
- }
- }
- }
- /**
- * 停止工作線程。工作線程不一定立即停止,只有在線程處于運行狀態時會立即停止
- */
- public void shutdown(){
- System.out.println("停止工作線程.");
- synchronized(taskQueue){
- for(int i = 0; i < DEFAULT_POOL_SIZE; i++){
- threadPool.get(i).shutdown();
- }
- }
- }
- /**
- * 添加消息到隊尾,
- */
- public void addTask(Task task){
- synchronized(taskQueue){
- taskQueue.add(task);
- taskQueue.notifyAll();
- }
- }
- }
二 工作線程---WorkerThread 顧名思義 它本身就是一個線程,而且是專門用來工作的,工作線程的主要任務是從任務隊列中取出任務 然后執行任務
三 任務隊列---TaskQueue FIFO數據結構 在出對入隊的時候要鎖定對象避免兩個線程重復處理某任務
在這里我采用的是java提供的ConcurrentLinkedQueue隊列,這是一個用鏈表實現的隊 可無限的擴大,具體用法請看doc
用到隊列的地方主要有兩個 addTask(Task task) 和 Task task = queue.poll();
四 任務接口---Task 任務接口只有一個方法 execute(),使用者只需實現這個接口就可以了
用法:
可以看出用戶的使用非常簡單
在jdk5中 java提供了線程池
有一點注意 千萬不要在servlet中調用線程池 因為servlet本來就是一個線程池
posted on 2008-09-07 11:10 大石頭 閱讀(219) 評論(0) 編輯 收藏 所屬分類: 多線程