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

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

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

    隨筆-199  評論-203  文章-11  trackbacks-0

    為什么要建立線程池?

     

    在多線程項目中,如果建立的線程過多,反而可能導致運行速度大大減慢,這是由于線程建立所花費的時間和資源都比較多。
    所以我們在多線程中必須很好地來管理線程, 在很好利用多線程能“同步工作”的好處之外,更有效地提高程序運行速度。

     

    線程池是什么?

     

    線程池是指具有固定數量的線程組成的一種組件。這些線程用來循環執行多個應用邏輯。

     

    怎么建立線程池?

     

    線程池主要包括4個部分,它們是:
    1. 線程管理
     

    主要是用來建立,啟動,銷毀工作線程和把工作任務加入工作線程。

     

    2. 工作線程
     

    它是真正的線程類,運行工作任務。

     

    3. 工作隊列
     

    它是用來封裝線程的容器。


    4. 工作任務
     

    它是實現應用邏輯的具體類。

     

     線程管理類:

    Java代碼 復制代碼
    1. <SPAN style="COLOR: #3366ff">import java.util.ArrayList;   
    2. import java.util.List;   
    3. import java.util.Queue;   
    4. import java.util.concurrent.ConcurrentLinkedQueue;   
    5.   
    6. /**  
    7.  * ThreadPoolManager.java  
    8.  *  
    9.  * Copyright (C)  2008 State Street Corporation. All Rights Reserved.  
    10.  *  
    11.  */  
    12.   
    13. /**  
    14.  * the thread pool manager, is responsible for starting and stopping the work thread.  
    15.  *   
    16.  * @author  e458487  
    17.  * @version 1.0  
    18.  */  
    19. public class ThreadPoolManager {   
    20.   
    21.     private static final int DEFAULT_POOL_SIZE = 4;   
    22.     private List<WorkThread> threadPool;   
    23.     private Queue<Task> taskQueue;   
    24.     private int poolSize;   
    25.        
    26.     public ThreadPoolManager() {   
    27.         this(DEFAULT_POOL_SIZE);   
    28.     }   
    29.        
    30.     public ThreadPoolManager(int poolSize) {   
    31.         if(poolSize <= 0) {   
    32.             this.poolSize = DEFAULT_POOL_SIZE;   
    33.         }else {   
    34.             this.poolSize = poolSize;   
    35.         }   
    36.         threadPool = new ArrayList<WorkThread>(this.poolSize);   
    37.         taskQueue = new ConcurrentLinkedQueue<Task>();   
    38.         startup();   
    39.     }   
    40.        
    41.     public void startup() {   
    42.         System.out.println("start work thread...");   
    43.         synchronized(taskQueue) {   
    44.             for(int i = 0; i < this.poolSize; i++) {   
    45.                 WorkThread workThread = new WorkThread(taskQueue);   
    46.                 threadPool.add(workThread);   
    47.                 workThread.start();   
    48.             }   
    49.         }   
    50.     }   
    51.        
    52.     public void shutdown() {   
    53.         System.out.println("shutdown work thread...");   
    54.         synchronized(taskQueue) {   
    55.             for(int i = 0; i < this.poolSize; i++) {   
    56.                 threadPool.get(i).shutdown();   
    57.             }              
    58.                
    59.             System.out.println("done...");   
    60.         }   
    61.     }   
    62.        
    63.     public void addTask(Task task) {   
    64.         synchronized(taskQueue) {   
    65.             taskQueue.add(task);   
    66.             taskQueue.notify();   
    67.         }   
    68.     }   
    69. }</SPAN>  

     

    工作線程類:

    Java代碼 復制代碼
    1. <SPAN style="COLOR: #3366ff">import java.util.Queue;   
    2.   
    3. /**  
    4.  * WorkThread.java  
    5.  *  
    6.  * Copyright (C)  2008 State Street Corporation. All Rights Reserved.  
    7.  *  
    8.  */  
    9.   
    10. /**  
    11.  * the work thread used pull the task of task queue, and execute it.  
    12.  *   
    13.  * @author  e458487  
    14.  * @version 1.0  
    15.  */  
    16. public class WorkThread extends Thread {   
    17.   
    18.     private boolean shutdown = false;   
    19.     private Queue<Task> queue;   
    20.        
    21.     public WorkThread(Queue<Task> queue) {   
    22.         this.queue = queue;   
    23.     }   
    24.        
    25.     public void run() {   
    26.         while(!shutdown) {   
    27.             try {   
    28.                 Thread.sleep(1000);   
    29.             } catch (InterruptedException e1) {   
    30.                 e1.printStackTrace();   
    31.             }   
    32.             System.out.println(Thread.currentThread() + " is running...");   
    33.             synchronized(queue) {   
    34.                 if(!queue.isEmpty()) {   
    35.                     Task task = queue.poll();   
    36.                     task.execute();   
    37.                 }else {   
    38.                     try {   
    39.                         queue.wait(1000);   
    40.                         System.out.println(Thread.currentThread() + " wait...");   
    41.                     }catch(InterruptedException e) {   
    42.                            
    43.                     }   
    44.                 }   
    45.             }   
    46.         }   
    47.     }   
    48.        
    49.     public void shutdown() {   
    50.         shutdown = true;   
    51.     }   
    52. }</SPAN>  

     

    工作任務接口:

     

    Java代碼 復制代碼
    1. <SPAN style="COLOR: #3366ff">/**  
    2.  * Task.java  
    3.  *  
    4.  * Copyright (C)  2008 State Street Corporation. All Rights Reserved.  
    5.  *  
    6.  */  
    7.   
    8. /**  
    9.  * The task want to execute.  
    10.  *   
    11.  * @author  e458487  
    12.  * @version 1.0  
    13.  */  
    14. public interface Task {   
    15.   
    16.     public void execute();   
    17. }</SPAN>  

     

    工作任務類:

    Java代碼 復制代碼
    1. <SPAN style="COLOR: #3366ff">/**  
    2.  * SimpleTask.java  
    3.  *  
    4.  * Copyright (C)  2008 State Street Corporation. All Rights Reserved.  
    5.  *  
    6.  */  
    7.   
    8. /**  
    9.  * @author  e458487  
    10.  * @version 1.0  
    11.  */  
    12. public class SimpleTask implements Task {   
    13.   
    14.     /* (non-Javadoc)  
    15.      * @see Task#execute()  
    16.      */  
    17.     public void execute() {   
    18.         System.out.println(Thread.currentThread());   
    19.     }   
    20.   
    21. }</SPAN>  

     

    線程池測試類:

    Java代碼 復制代碼
    1. <SPAN style="COLOR: #3366ff">/**  
    2.  * ThreadPoolDemo.java  
    3.  *  
    4.  * Copyright (C)  2008 State Street Corporation. All Rights Reserved.  
    5.  *  
    6.  */  
    7.   
    8. /**  
    9.  * @author  e458487  
    10.  * @version 1.0  
    11.  */  
    12. public class ThreadPoolDemo {   
    13.   
    14.     public static void main(String[] args) {   
    15.         ThreadPoolManager threadMg = new ThreadPoolManager();   
    16.            
    17.         for(int i = 0; i < 50; i++) {   
    18.             threadMg.addTask(new SimpleTask());   
    19.         }   
    20.         try {   
    21.             Thread.sleep(5000);   
    22.         } catch (InterruptedException e) {   
    23.             e.printStackTrace();   
    24.         }   
    25.         threadMg.shutdown();   
    26.     }      
    27. }</SPAN>  

    http://www.javaeye.com/topic/387566
    posted on 2009-05-15 19:27 Werther 閱讀(725) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲码和欧洲码一码二码三码| 亚洲AV无码国产精品色午友在线| 亚洲另类精品xxxx人妖| 亚洲免费观看视频| 久久精品国产亚洲沈樵| a级成人毛片免费图片| 亚洲精品午夜无码电影网| 一出一进一爽一粗一大视频免费的| 亚洲高清偷拍一区二区三区| 青娱乐在线免费观看视频| 免费国产成人高清在线观看麻豆| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 国产AV无码专区亚洲AV漫画| free哆拍拍免费永久视频| 亚洲最大av无码网址| 一区二区三区在线免费观看视频| 久久精品国产精品亚洲人人| 91免费在线视频| 亚洲国产精华液网站w| 7x7x7x免费在线观看| 亚洲人色大成年网站在线观看| 国产美女在线精品免费观看| 亚洲成a人片在线观看天堂无码| 国产免费观看黄AV片| 美女巨胸喷奶水视频www免费| 免费a级毛片无码a∨蜜芽试看| 亚洲中文字幕AV每天更新| 国产jizzjizz免费看jizz| fc2免费人成在线视频| 亚洲av福利无码无一区二区| 日韩精品视频在线观看免费| 区久久AAA片69亚洲| 2022久久国产精品免费热麻豆| 亚洲精品无AMM毛片| 亚洲国产成人久久综合野外| 免费福利在线视频| 国产午夜亚洲精品| 中文字幕日韩亚洲| 桃子视频在线观看高清免费完整| 日韩亚洲人成在线综合| 亚洲av无码乱码国产精品|