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

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

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

    太陽雨

    痛并快樂著

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      67 Posts :: 3 Stories :: 33 Comments :: 0 Trackbacks

     

    在有些方法里, 比如登陸,一般需要順序調(diào)用多個系統(tǒng)功能才能完成初始化操作.
    比如 安全校驗-》獲取用戶權(quán)限-》獲取用戶設(shè)置信息-》獲取系統(tǒng)字典 等等, 在某些EAI模式的應(yīng)用里,這些調(diào)用可能都是遠程調(diào)用,每個調(diào)用時間可能從0.5秒到數(shù)秒不等, 這樣累計下來用戶一個登陸操作,在后臺處理時間可能就有3,4秒,加上網(wǎng)絡(luò)傳輸延時,會主觀上給用戶造成系統(tǒng)很慢的感覺。

    在單個方法調(diào)用效率無法改進的前提下,一個簡單的辦法是將調(diào)用方式由串行改為并行,即以多個thread分別去完成方法調(diào)用,最后匯總。

    在java 5以前,因為線程的特性限制,必須手工編碼實現(xiàn)線程完成狀態(tài)的調(diào)用檢查。

    比如
     // thread 
    public void run() {
        ......
       finished = true;
     }
      
      public boolean isFinished() {
       return finished;
      }


    // 以阻塞循環(huán)的方式檢查是否執(zhí)行完畢
    while(!remoteCall.isFinished()) {
        try {
            Thread.sleep(100);
       } catch (InterruptedException e) {
         e.printStackTrace();
        }
    }

    這樣的代碼是繁瑣,較低效率,也容易出錯的,尤其在線程多于2個的時候。而在服務(wù)器方代碼中過多的線程使用又可能會導(dǎo)致內(nèi)存溢出和資源泄露。

    今天翻書的時候發(fā)現(xiàn)java 5中的cucurrent包對此進行了改進 繼承自Callable 的類有能力將執(zhí)行結(jié)果返回,并且可以自行檢查執(zhí)行是否結(jié)束。

      public class RandomPrimeSearch implements Callable<BigInteger> {
           public BigInteger call( ) {
                // do operation here
                return BigInteger.probablePrime(bitSize, prng);
           }
      }

      FutureTask<BigInteger> task =     new FutureTask<BigInteger>(new RandomPrimeSearch(512));  //需要利用泛型模板返回處理結(jié)果
      new Thread(task).start( );

      BigInteger result = task.get( );  //此處會自動判斷是否執(zhí)行結(jié)束,未結(jié)束會繼續(xù)等待。也可以設(shè)定最大等待時間
        
        //為了提高效率 也可以使用service方式調(diào)用
        ExecutorService service = Executors.newFixedThreadPool(5);

        Future<BigInteger> prime1 = service.submit(new RandomPrimeSearch(512));


    這樣一來,使用這種并發(fā)模式處理代碼就容易多了。程序可以簡單的修改為這樣的結(jié)構(gòu)
    remoateCall1 = doRemoteCall1();  // 啟動線程1 將方法處理以封裝到線程中
    remoateCall2 = doRemoteCall2();  // 啟動線程2

    remoteCall1.get().getUserSetting() ;
    remoteCall2.get().getDictionaryList(); 
    ....

    呵呵,基本和順序執(zhí)行時差不多,代碼修改量比較小。

    java 5中引入了線程執(zhí)行服務(wù)ExecutorService 的概念以后, 如果以線程池的方式執(zhí)行線程調(diào)用,資源消耗會大幅度減少,所以不用太擔心并發(fā)處理會產(chǎn)生過多的系統(tǒng)負荷。
    posted on 2008-11-02 14:52 小蟲旺福 閱讀(345) 評論(0)  編輯  收藏 所屬分類: javaEE
    主站蜘蛛池模板: 四虎精品视频在线永久免费观看 | 亚洲精品无码mv在线观看网站| 亚洲高清乱码午夜电影网| 永久免费av无码不卡在线观看| 亚洲欧洲校园自拍都市| av无码久久久久不卡免费网站| 亚洲系列中文字幕| 国产大片免费网站不卡美女| 亚洲一级片在线播放| 久久久久久99av无码免费网站| 亚洲精品国产suv一区88| 免费一级国产生活片| 一级中文字幕免费乱码专区| 亚洲色欲久久久综合网东京热| 波多野结衣免费一区视频| 日韩亚洲Av人人夜夜澡人人爽| 麻豆国产精品免费视频| 亚洲人成网亚洲欧洲无码| 亚洲成?v人片天堂网无码| 中文字幕在线免费视频| 亚洲伦理一区二区| 免费国产黄线在线观看| 色老头综合免费视频| 亚洲视频在线播放| 曰批全过程免费视频在线观看| 亚洲a∨国产av综合av下载| 久久亚洲精品无码播放| 国产在线精品免费aaa片| 亚洲中文字幕无码av在线| 国产又大又黑又粗免费视频| 中文字幕不卡免费高清视频| 久久久久亚洲精品日久生情| 日本午夜免费福利视频| 国内精品免费久久影院| 日本亚洲免费无线码| 久久久久亚洲AV综合波多野结衣| 57pao国产成永久免费视频| 白白色免费在线视频| 亚洲网红精品大秀在线观看 | 国产亚洲精品美女久久久久久下载| 久久亚洲高清综合|