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

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

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

    posts - 101,  comments - 29,  trackbacks - 0

    優化鎖,之前的鎖是采用一個static的Object實現的,這要就會有一個問題,如果我創建了多個Executer,那么所有Job都會持有一把鎖,既影響性能,也容易出現死鎖的情況。所以,改成每個Executer持有一把鎖。

    Executer代碼如下:

     

    Java代碼  收藏代碼
    1. public class Executer {  
    2.     //計算已經派發的任務數(條件謂詞)  
    3.     public static int THREAD_COUNT = 0;  
    4.     //存儲任務的執行結果  
    5.     private List<Future<Object>> futres = new ArrayList<Future<Object>>();   
    6.     //條件隊列鎖  
    7.     public final Object lock = new Object();  
    8.     //線程池  
    9.     private ExecutorService pool = null;  
    10.     public Executer() {  
    11.         this(1);  
    12.     }  
    13.     public Executer(int threadPoolSize) {  
    14.         pool = Executors.newFixedThreadPool(threadPoolSize);  
    15.     }  
    16.     /** 
    17.      * 任務派發 
    18.      * @param job 
    19.      */  
    20.     public void fork(Job job){  
    21.         //設置同步鎖  
    22.         job.setLock(lock);  
    23.         //將任務派發給線程池去執行  
    24.         futres.add(pool.submit(job));  
    25.         //增加線程數  
    26.         synchronized (lock) {  
    27.             THREAD_COUNT++;  
    28.         }  
    29.     }  
    30.     /** 
    31.      * 統計任務結果 
    32.      */  
    33.     public List<Object> join(){  
    34.         synchronized (lock) {  
    35.             while(THREAD_COUNT > 0){//檢查線程數,如果為0,則表示所有任務處理完成  
    36.                 System.out.println("threadCount: "+THREAD_COUNT);  
    37.                 try {  
    38.                     lock.wait();//如果任務沒有全部完成,則掛起。等待完成的任務給予通知  
    39.                 } catch (InterruptedException e) {  
    40.                     e.printStackTrace();  
    41.                 }  
    42.             }  
    43.         }  
    44.         List<Object> list = new ArrayList<Object>();  
    45.         //取出每個任務的處理結果,匯總后返回  
    46.         for (Future<Object> future : futres) {  
    47.             try {  
    48.                 Object result = future.get();//因為任務都已經完成,這里直接get  
    49.                 list.add(result);  
    50.             } catch (Exception e) {  
    51.                 e.printStackTrace();  
    52.             }   
    53.         }  
    54.         return list;  
    55.     }  
    56. }  

     Job類:

     

    Java代碼  收藏代碼
    1. public abstract class Job implements Callable<Object> {  
    2.   
    3.     //鎖  
    4.     private Object lock = null;  
    5.   
    6.     void setLock(Object lock) {  
    7.         this.lock = lock;  
    8.     }  
    9.   
    10.     @Override  
    11.     public Object call() throws Exception {  
    12.         Object result = this.execute();//執行子類具體任務  
    13.         synchronized (lock) {  
    14.             //處理完業務后,任務結束,遞減線程數,同時喚醒主線程  
    15.             Executer.THREAD_COUNT--;  
    16.             lock.notifyAll();  
    17.         }  
    18.         return result;  
    19.     }  
    20.     /** 
    21.      * 業務處理函數 
    22.      */  
    23.     public abstract Object execute();  
    24.       
    25. }  

     測試結果:

     

    Java代碼  收藏代碼
    1. threadCount: 10  
    2. running thread id = 8  
    3. running thread id = 10  
    4. running thread id = 9  
    5. running thread id = 12  
    6. running thread id = 11  
    7. threadCount: 8  
    8. threadCount: 7  
    9. threadCount: 6  
    10. threadCount: 5  
    11. running thread id = 12  
    12. running thread id = 8  
    13. running thread id = 11  
    14. threadCount: 2  
    15. running thread id = 10  
    16. threadCount: 1  
    17. running thread id = 9  
    18. ResultSize: 10  
    19. time: 2001  

     OK!

    這樣每個Executer就可以使用自己的lock,而相互不受同步的影響

    posted on 2012-07-15 01:21 mixer-a 閱讀(1110) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 精品无码专区亚洲| 91亚洲自偷手机在线观看| 亚洲综合色丁香婷婷六月图片| 久久久久久一品道精品免费看| 亚洲人成人一区二区三区| www在线观看播放免费视频日本| 波多野结衣视频在线免费观看| 久久精品国产亚洲av瑜伽| 国产网站在线免费观看| 曰批全过程免费视频观看免费软件| 免费大香伊蕉在人线国产| 男女猛烈xx00免费视频试看| 国产成人精品免费直播| 十八禁的黄污污免费网站| 亚洲综合精品香蕉久久网| 美女视频黄a视频全免费网站色窝| 亚洲av日韩综合一区在线观看| 久久香蕉国产线看免费| 亚洲一级免费毛片| 成年女人永久免费观看片| 一区二区免费在线观看| 国产AV无码专区亚洲AVJULIA | 亚洲精品亚洲人成在线麻豆| 亚洲免费电影网站| 亚洲色无码国产精品网站可下载| 精品久久免费视频| 国产裸体美女永久免费无遮挡| 亚洲av无码一区二区三区不卡 | 99久久免费国产精精品| 久久亚洲美女精品国产精品 | 亚洲国产成人久久综合碰| 三级毛片在线免费观看| 亚洲国产中文在线视频| 国产美女做a免费视频软件| 国产偷伦视频免费观看| 色噜噜亚洲男人的天堂| 亚洲精品国产福利一二区| 麻豆成人久久精品二区三区免费| 亚洲欧美国产国产一区二区三区| 亚洲一区二区视频在线观看| **俄罗斯毛片免费|