<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, 評(píng)論 - 3, 引用 - 0
    數(shù)據(jù)加載中……

    線程池的實(shí)現(xiàn)

    線程池也許很多比較陌生 但是提到servlet每個(gè)人都知道,servlet就是用線程池來(lái)處理請(qǐng)求的
    一個(gè)線程池由線程池管理器 工作線程 任務(wù)隊(duì)列和任務(wù)接口組成
    一 線程池管理器---ThreadPoolMananger 主要負(fù)責(zé)啟動(dòng) 停止工作線程
    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.      * 啟動(dòng)線程池 開始處理任務(wù)  
    27.      */  
    28.     private void startup(){   
    29.         System.out.println("啟動(dòng)工作線程。。。");   
    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.      * 停止工作線程。工作線程不一定立即停止,只有在線程處于運(yùn)行狀態(tài)時(shí)會(huì)立即停止  
    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.      * 添加消息到隊(duì)尾,    
    54.      */  
    55.     public void addTask(Task task){   
    56.         synchronized(taskQueue){   
    57.             taskQueue.add(task);   
    58.             taskQueue.notifyAll();     
    59.         }   
    60.     }   
    61.   
    62. }  

    二 工作線程---WorkerThread 顧名思義 它本身就是一個(gè)線程,而且是專門用來(lái)工作的,工作線程的主要任務(wù)是從任務(wù)隊(duì)列中取出任務(wù) 然后執(zhí)行任務(wù)

  • /**  
  •  * 工作線程  
  •  * @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){ //獲得對(duì)象鎖 禁止其他線程訪問(wèn)   
  •                 if(!queue.isEmpty()){   
  •                     //處理任務(wù)    
  •                     Task task = queue.poll();   
  •                     task.execute();   
  •                 }else{   
  •                     try {   
  •                         queue.wait(); //釋放鎖 線程處于阻賽狀態(tài) 等待notify喚醒   
  •                     } catch (InterruptedException e) {   
  •                     }   
  •                 }   
  •             }   
  •         }//end while   
  •     }   
  •        
  •     /**  
  •      * 調(diào)用該方法后不一定會(huì)立即結(jié)束線程, 只有在線程處于運(yùn)行狀態(tài)且處理完當(dāng)前任務(wù)后才結(jié)束  
  •      */  
  •     public void shutdown(){   
  •         shutdown = true;   
  •     }   
  • }  
  •  

    三 任務(wù)隊(duì)列---TaskQueue FIFO數(shù)據(jù)結(jié)構(gòu) 在出對(duì)入隊(duì)的時(shí)候要鎖定對(duì)象避免兩個(gè)線程重復(fù)處理某任務(wù)
    在這里我采用的是java提供的ConcurrentLinkedQueue隊(duì)列,這是一個(gè)用鏈表實(shí)現(xiàn)的隊(duì) 可無(wú)限的擴(kuò)大,具體用法請(qǐng)看doc
    用到隊(duì)列的地方主要有兩個(gè) addTask(Task task) 和 Task task = queue.poll();


    四 任務(wù)接口---Task 任務(wù)接口只有一個(gè)方法 execute(),使用者只需實(shí)現(xiàn)這個(gè)接口就可以了

  • 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實(shí)現(xiàn)了Task接口   
  •         }   
  •         pool.shutdown();   
  •     }   
  •        
  • 可以看出用戶的使用非常簡(jiǎn)單
    在jdk5中 java提供了線程池
    有一點(diǎn)注意 千萬(wàn)不要在servlet中調(diào)用線程池 因?yàn)閟ervlet本來(lái)就是一個(gè)線程池




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

    主站蜘蛛池模板: 少妇亚洲免费精品| 亚洲黄色高清视频| 永久免费AV无码国产网站| 亚洲精品视频免费| 亚洲av无码偷拍在线观看| 亚洲国产av美女网站| 国产亚洲一区二区在线观看| 日本黄色免费观看| 中国在线观看免费高清完整版| 久久国产乱子伦精品免费一| 一区二区在线视频免费观看| 羞羞网站免费观看| 亚洲国产成人久久精品大牛影视| 亚洲国产综合自在线另类| 亚洲五月六月丁香激情| 亚洲精品中文字幕乱码三区| 亚洲精品专区在线观看| 亚洲AⅤ无码一区二区三区在线| 最好免费观看韩国+日本| 18禁成年无码免费网站无遮挡| 免费观看激色视频网站bd| 少妇无码一区二区三区免费| 三年片在线观看免费| 成人毛片100免费观看| 一级毛片在线免费视频| 人妻仑刮八A级毛片免费看| 美女羞羞喷液视频免费| 色窝窝亚洲AV网在线观看| 色欲色欲天天天www亚洲伊| 亚洲色大成网站WWW国产| 亚洲熟妇AV日韩熟妇在线| 中日韩亚洲人成无码网站| 亚洲最大中文字幕无码网站| 亚洲色偷偷综合亚洲AV伊人蜜桃| 一本天堂ⅴ无码亚洲道久久| 亚洲人成色4444在线观看| 亚洲AV无码成人网站在线观看| 香港一级毛片免费看| 人人公开免费超级碰碰碰视频| eeuss在线兵区免费观看| 99在线热播精品免费99热|