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

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

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

    細心!用心!耐心!

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

    BlogJava 聯系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    線程池也許很多比較陌生 但是提到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本來就是一個線程池


    posted on 2008-05-16 17:07 張金鵬 閱讀(524) 評論(0)  編輯  收藏 所屬分類: 多線程編程
    主站蜘蛛池模板: 处破女第一次亚洲18分钟| 国产精品福利在线观看免费不卡| 亚洲制服丝袜精品久久| 亚洲欧美日韩中文字幕一区二区三区| 亚洲va中文字幕| 国产激情免费视频在线观看| 最近的免费中文字幕视频| 亚洲综合色自拍一区| 久久久久se色偷偷亚洲精品av | 亚洲综合激情五月丁香六月 | 日本在线免费观看| 亚洲爆乳无码专区| 最新亚洲人成无码网www电影| 在线观看免费毛片| 亚洲精品美女视频| a一级爱做片免费| 不卡一卡二卡三亚洲| 国产成人亚洲综合无| 成人无码区免费视频观看 | 亚洲美女中文字幕| 免费在线黄色电影| 一本色道久久88亚洲综合| 天堂亚洲国产中文在线| 18以下岁毛片在免费播放| 国产精品亚洲mnbav网站| 久久亚洲精品11p| 毛片免费在线观看网址| 色偷偷噜噜噜亚洲男人| 久久亚洲av无码精品浪潮| 久久国产精品免费视频| 自拍偷区亚洲国内自拍| 国产免费av片在线无码免费看| 最新国产精品亚洲| 亚洲人成电影网站国产精品| 国产亚洲精品免费| 亚洲中文字幕第一页在线| 免费黄色福利视频| 亚洲精品第一国产综合精品| 浮力影院第一页小视频国产在线观看免费| 亚洲首页在线观看| 四虎影视在线永久免费观看|