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

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

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

    I want to fly higher
    programming Explorer
    posts - 114,comments - 263,trackbacks - 0
    1.直接看代碼中的demo:

    package com.landon.mavs.example.concurrent;

    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    import java.util.concurrent.TimeUnit;

    import com.google.common.util.concurrent.FutureCallback;
    import com.google.common.util.concurrent.Futures;
    import com.google.common.util.concurrent.ListenableFuture;
    import com.google.common.util.concurrent.ListeningExecutorService;
    import com.google.common.util.concurrent.MoreExecutors;

    /**
     * 
     * 使用guava實現(xiàn)異步回調(diào) {@link java.util.concurrent.Future}
     * {@link com.google.common.util.concurrent.ListenableFuture}
     * {@link com.google.common.util.concurrent.FutureCallback}
     * 
     * @author landon
     * 
     
    */

    public class FutureCallbackExample {
        
    public static void main(String[] args) throws Exception {
            
    // 原生的Future模式,實現(xiàn)異步
            ExecutorService nativeExecutor = Executors.newSingleThreadExecutor();
            Future<String> nativeFuture = nativeExecutor
                    .submit(new Callable<String>() {

                        @Override
                        
    public String call() throws Exception {
                            
    // 使用sleep模擬調(diào)用耗時
                            TimeUnit.SECONDS.sleep(1);
                            
    return "This is native future call.not support async callback";
                        }

                    }
    );

            
    // Future只實現(xiàn)了異步,而沒有實現(xiàn)回調(diào).所以此時主線程get結(jié)果時阻塞.或者可以輪訓(xùn)以便獲取異步調(diào)用是否完成
            System.out.println(nativeFuture.get());

            
    // 好的實現(xiàn)應(yīng)該是提供回調(diào),即異步調(diào)用完成后,可以直接回調(diào).本例采用guava提供的異步回調(diào)接口,方便很多.
            ListeningExecutorService guavaExecutor = MoreExecutors
                    .listeningDecorator(Executors.newSingleThreadExecutor());
            
    final ListenableFuture<String> listenableFuture = guavaExecutor
                    .submit(new Callable<String>() {

                        @Override
                        
    public String call() throws Exception {
                            Thread.sleep(1000);
                            
    return "this is guava future call.support async callback";
                        }

                    }
    );

            
    // 注冊監(jiān)聽器,即異步調(diào)用完成時會在指定的線程池中執(zhí)行注冊的監(jiān)聽器
            listenableFuture.addListener(new Runnable() {

                @Override
                
    public void run() {
                    
    try {
                        System.out.println("async complete.result:"
                                
    + listenableFuture.get());
                    }
     catch (Exception e) {
                    }

                }

            }
    , Executors.newSingleThreadExecutor());

            
    // 主線程可以繼續(xù)執(zhí)行,異步完成后會執(zhí)行注冊的監(jiān)聽器任務(wù).
            System.out.println("go on execute.asyn complete will callback");

            
    // 除了ListenableFuture,guava還提供了FutureCallback接口,相對來說更加方便一些.
            ListeningExecutorService guavaExecutor2 = MoreExecutors
                    .listeningDecorator(Executors.newSingleThreadExecutor());
            
    final ListenableFuture<String> listenableFuture2 = guavaExecutor2
                    .submit(new Callable<String>() {

                        @Override
                        
    public String call() throws Exception {
                            Thread.sleep(1000);
                            System.out.println("asyncThreadName:"
                                    
    + Thread.currentThread().getName());
                            
    return "this is guava future call.support async callback using FutureCallback";
                        }

                    }
    );
            
    // 注意這里沒用指定執(zhí)行回調(diào)的線程池,從輸出可以看出,默認是和執(zhí)行異步操作的線程是同一個.
            Futures.addCallback(listenableFuture2, new FutureCallback<String>() {

                @Override
                
    public void onSuccess(String result) {
                    System.out
                            .println("async callback(using FutureCallback) result:"
                                    
    + result);
                    System.out.println("execute callback threadName:"
                            
    + Thre            }ad.currentThread().getName());


                @Override
                
    public void onFailure(Throwable t) {
                }

            }
    );
        }

    }



    2.總結(jié):利用guava的ListenableFuture和FutureCallback方便的實現(xiàn)異步回調(diào).
    posted on 2014-02-27 14:54 landon 閱讀(7199) 評論(3)  編輯  收藏 所屬分類: Program

    FeedBack:
    # re: 使用guava實現(xiàn)異步回調(diào)
    2014-02-28 10:09 | 魏五鎖業(yè)
    謝謝博主分享 啊  回復(fù)  更多評論
      
    # re: 使用guava實現(xiàn)異步回調(diào)
    2014-03-01 08:14 | 魏五鎖業(yè)
    看不明白啊博主  回復(fù)  更多評論
      
    # re: 使用guava實現(xiàn)異步回調(diào)
    2014-03-05 16:37 | 百家樂訊特
    學(xué)習(xí)了··謝謝!  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲一区二区三区在线网站| 在线永久免费观看黄网站| 久草免费福利在线| 中国精品一级毛片免费播放| 精品无码国产污污污免费网站| 最近高清中文字幕免费| 国产亚洲精品a在线无码| 亚洲精品中文字幕乱码影院| 久久亚洲精品11p| 国产精品区免费视频| 最新中文字幕电影免费观看| 亚洲精品国产高清不卡在线| 亚洲人成亚洲精品| 亚洲AV成人无码网天堂| 在线观看亚洲免费| 成人免费网站视频www| 老司机69精品成免费视频| 免费看大美女大黄大色| 亚洲高清中文字幕综合网| 亚洲阿v天堂在线2017免费| 最近免费中文字幕大全视频 | 国产亚洲精品自在久久| 99久久国产精品免费一区二区 | 亚洲av无码精品网站| 亚洲国产成人久久一区二区三区 | 亚洲一区二区三区四区视频| 一本岛v免费不卡一二三区| 亚洲免费综合色在线视频| 国产亚洲日韩在线三区| 亚洲国产精品成人AV在线| 免费a级毛片无码a∨性按摩| 亚洲国产精品张柏芝在线观看 | 亚洲人成在线免费观看| 亚洲A∨无码无在线观看| 中国毛片免费观看| 亚洲天堂中文字幕在线观看| 国产18禁黄网站免费观看| 亚洲av日韩aⅴ无码色老头| 亚洲日本一区二区三区在线| 99久久成人国产精品免费| 国产精品麻豆免费版|