細心!用心!耐心!

          吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點粗墨,七八筆買賣,九十道人情。

          BlogJava 聯(lián)系 聚合 管理
            1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
          線程池也許很多比較陌生 但是提到servlet每個人都知道,servlet就是用線程池來處理請求的
          一個線程池由線程池管理器 工作線程 任務(wù)隊列和任務(wù)接口組成
          一 線程池管理器---ThreadPoolMananger 主要負責(zé)啟動 停止工作線程
          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.      * 啟動線程池 開始處理任務(wù)  
          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.      * 停止工作線程。工作線程不一定立即停止,只有在線程處于運行狀態(tài)時會立即停止  
          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 顧名思義 它本身就是一個線程,而且是專門用來工作的,工作線程的主要任務(wù)是從任務(wù)隊列中取出任務(wù) 然后執(zhí)行任務(wù)

        1. /**  
        2.  * 工作線程  
        3.  * @author XuLiangYong  
        4.  * Jul 20, 2007 3:47:52 PM  
        5.  */  
        6. public class WorkThread extends Thread{   
        7.     private boolean shutdown = false;   
        8.     private Queue<Task> queue;   
        9.        
        10.     public WorkThread(Queue<Task> queue){   
        11.         this.queue = queue;   
        12.     }   
        13.        
        14.     public void run(){   
        15.         while(!shutdown){   
        16.             synchronized(queue){ //獲得對象鎖 禁止其他線程訪問   
        17.                 if(!queue.isEmpty()){   
        18.                     //處理任務(wù)    
        19.                     Task task = queue.poll();   
        20.                     task.execute();   
        21.                 }else{   
        22.                     try {   
        23.                         queue.wait(); //釋放鎖 線程處于阻賽狀態(tài) 等待notify喚醒   
        24.                     } catch (InterruptedException e) {   
        25.                     }   
        26.                 }   
        27.             }   
        28.         }//end while   
        29.     }   
        30.        
        31.     /**  
        32.      * 調(diào)用該方法后不一定會立即結(jié)束線程, 只有在線程處于運行狀態(tài)且處理完當前任務(wù)后才結(jié)束  
        33.      */  
        34.     public void shutdown(){   
        35.         shutdown = true;   
        36.     }   
        37. }  
        38.  

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


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

        39. public interface Task {   
        40.     void execute();   
        41. }


        42. 用法:

        43. public class TestThreadPoolManager extends TestCase {   
        44.        
        45.     public void test(){   
        46.         ThreadPoolManager pool = new ThreadPoolManager();   
        47.         for(int i = 0; i < 100; i++){   
        48.             pool.addTask(new SimpleTask(new MyManager(), i)); //SimpleTask實現(xiàn)了Task接口   
        49.         }   
        50.         pool.shutdown();   
        51.     }   
        52.        
        53. 可以看出用戶的使用非常簡單
          在jdk5中 java提供了線程池
          有一點注意 千萬不要在servlet中調(diào)用線程池 因為servlet本來就是一個線程池


          posted on 2008-05-16 17:07 張金鵬 閱讀(522) 評論(0)  編輯  收藏 所屬分類: 多線程編程
          主站蜘蛛池模板: 鹿泉市| 理塘县| 天柱县| 隆德县| 确山县| 固阳县| 湖南省| 定襄县| 寿光市| 耒阳市| 岳池县| 平塘县| 大埔县| 和硕县| 福贡县| 六枝特区| 麻阳| 石景山区| 房产| 高要市| 濮阳市| 肃北| 波密县| 横峰县| 城市| 临沭县| 鲁山县| 常熟市| 德江县| 新丰县| 密山市| 江永县| 南郑县| 万荣县| 大丰市| 南陵县| 永安市| 望江县| 黑山县| 宝清县| 高阳县|