<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    keep moving!

    We must not cease from exploration. And the end of all our exploring will be to arrive where we began and to know the place for the first time.
    隨筆 - 37, 文章 - 2, 評論 - 3, 引用 - 0
    數據加載中……

    線程池的實現

    線程池也許很多比較陌生 但是提到servlet每個人都知道,servlet就是用線程池來處理請求的
    一個線程池由線程池管理器 工作線程 任務隊列和任務接口組成
    一 線程池管理器---ThreadPoolMananger 主要負責啟動 停止工作線程
    1. public class ThreadPoolManager {   
    2.   
    3.     private static int DEFAULT_POOL_SIZE = 4;   
    4.     private List<WorkThread> threadPool;   
    5.     private Queue<Task> taskQueue;   
    6.     private int poolSize;   
    7.        
    8.     public ThreadPoolManager(){   
    9.         this(DEFAULT_POOL_SIZE);   
    10.     }   
    11.        
    12.     public ThreadPoolManager(int poolSize){   
    13.         if(poolSize <= 0){   
    14.             this.poolSize = DEFAULT_POOL_SIZE;   
    15.         }else{   
    16.             this.poolSize = poolSize;   
    17.         }   
    18.            
    19.         threadPool = new ArrayList<WorkThread>(this.poolSize);   
    20.         taskQueue = new ConcurrentLinkedQueue<Task>();   
    21.            
    22.         startup();   
    23.     }   
    24.        
    25.     /**  
    26.      * 啟動線程池 開始處理任務  
    27.      */  
    28.     private void startup(){   
    29.         System.out.println("啟動工作線程。。。");   
    30.         synchronized(taskQueue){   
    31.             for(int i = 0; i < DEFAULT_POOL_SIZE; i++){   
    32.                 WorkThread workThread = new WorkThread(taskQueue);   
    33.                 threadPool.add( workThread );   
    34.                 workThread.start();   
    35.             }   
    36.         }   
    37.            
    38.     }   
    39.        
    40.     /**  
    41.      * 停止工作線程。工作線程不一定立即停止,只有在線程處于運行狀態時會立即停止  
    42.      */  
    43.     public void shutdown(){   
    44.         System.out.println("停止工作線程.");   
    45.         synchronized(taskQueue){   
    46.             for(int i = 0; i < DEFAULT_POOL_SIZE; i++){   
    47.                 threadPool.get(i).shutdown();   
    48.             }   
    49.         }   
    50.     }   
    51.        
    52.     /**  
    53.      * 添加消息到隊尾,    
    54.      */  
    55.     public void addTask(Task task){   
    56.         synchronized(taskQueue){   
    57.             taskQueue.add(task);   
    58.             taskQueue.notifyAll();     
    59.         }   
    60.     }   
    61.   
    62. }  

    二 工作線程---WorkerThread 顧名思義 它本身就是一個線程,而且是專門用來工作的,工作線程的主要任務是從任務隊列中取出任務 然后執行任務

  • /**  
  •  * 工作線程  
  •  * @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;   
  •     }   
  • }  
  •  

    三 任務隊列---TaskQueue FIFO數據結構 在出對入隊的時候要鎖定對象避免兩個線程重復處理某任務
    在這里我采用的是java提供的ConcurrentLinkedQueue隊列,這是一個用鏈表實現的隊 可無限的擴大,具體用法請看doc
    用到隊列的地方主要有兩個 addTask(Task task) 和 Task task = queue.poll();


    四 任務接口---Task 任務接口只有一個方法 execute(),使用者只需實現這個接口就可以了

  • 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();   
  •     }   
  •        
  • 可以看出用戶的使用非常簡單
    在jdk5中 java提供了線程池
    有一點注意 千萬不要在servlet中調用線程池 因為servlet本來就是一個線程池




    張金鵬 2008-05-16 17:07 發表評論

    posted on 2008-09-07 11:10 大石頭 閱讀(214) 評論(0)  編輯  收藏 所屬分類: 多線程

    主站蜘蛛池模板: 一本久久免费视频| 国产精品日本亚洲777| 久久午夜无码免费| 亚洲熟妇无码另类久久久| 一级做a爱过程免费视频高清| 日韩免费毛片视频| 久久久久亚洲AV无码去区首| 男女交性永久免费视频播放| 亚洲国产精品日韩av不卡在线| 天天干在线免费视频| 337P日本欧洲亚洲大胆艺术图| 国产成人精品123区免费视频| 黄床大片30分钟免费看| 亚洲精品麻豆av| 最好免费观看高清在线| 亚洲国产成人精品不卡青青草原| 久久久久久AV无码免费网站| 亚洲精品综合久久中文字幕| 麻豆国产精品免费视频| 亚洲精品又粗又大又爽A片| 日韩视频免费在线| 亚洲精品黄色视频在线观看免费资源 | 日日麻批免费40分钟日本的| 免费中文字幕视频| 亚洲成a人在线看天堂无码| 一区在线免费观看| 亚洲V无码一区二区三区四区观看| 1a级毛片免费观看| 久久亚洲精品无码gv| 久久亚洲中文字幕精品一区四 | 色噜噜的亚洲男人的天堂| 亚洲精品亚洲人成在线观看下载| 免费污视频在线观看| 亚洲av午夜精品无码专区| 免费一级毛片正在播放| 国产免费无码AV片在线观看不卡| 亚洲av无码一区二区三区观看| 全部免费a级毛片| 精品无码无人网站免费视频 | 无码成A毛片免费| 亚洲熟妇无码一区二区三区|