<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實現異步回調 {@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模式,實現異步
            ExecutorService nativeExecutor = Executors.newSingleThreadExecutor();
            Future<String> nativeFuture = nativeExecutor
                    .submit(new Callable<String>() {

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

                    }
    );

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

            
    // 好的實現應該是提供回調,即異步調用完成后,可以直接回調.本例采用guava提供的異步回調接口,方便很多.
            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";
                        }

                    }
    );

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

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

                }

            }
    , Executors.newSingleThreadExecutor());

            
    // 主線程可以繼續執行,異步完成后會執行注冊的監聽器任務.
            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";
                        }

                    }
    );
            
    // 注意這里沒用指定執行回調的線程池,從輸出可以看出,默認是和執行異步操作的線程是同一個.
            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.總結:利用guava的ListenableFuture和FutureCallback方便的實現異步回調.
    posted on 2014-02-27 14:54 landon 閱讀(7189) 評論(3)  編輯  收藏 所屬分類: Program

    FeedBack:
    # re: 使用guava實現異步回調
    2014-02-28 10:09 | 魏五鎖業
    謝謝博主分享 啊  回復  更多評論
      
    # re: 使用guava實現異步回調
    2014-03-01 08:14 | 魏五鎖業
    看不明白啊博主  回復  更多評論
      
    # re: 使用guava實現異步回調
    2014-03-05 16:37 | 百家樂訊特
    學習了··謝謝!  回復  更多評論
      
    主站蜘蛛池模板: 亚洲国产精品无码久久久不卡| 久久一区二区免费播放| 色窝窝亚洲AV网在线观看| 成在线人视频免费视频| 18成禁人视频免费网站| 免费成人av电影| 特黄特色大片免费| 亚洲精品成人片在线观看| 亚洲网站在线免费观看| 黄色网址在线免费观看| 中文字幕在线免费观看| 亚洲视频在线一区二区| 久久精品国产亚洲AV果冻传媒| 亚洲的天堂av无码| AV免费网址在线观看| 亚洲Av无码精品色午夜| 免费很黄无遮挡的视频毛片| 国产成人yy免费视频| 国产亚洲综合成人91精品| 黄色网址免费在线| 激情综合色五月丁香六月亚洲| 亚洲Av永久无码精品一区二区| 免费在线看黄网站| 亚洲福利一区二区精品秒拍| 中文在线免费不卡视频| 婷婷综合缴情亚洲狠狠尤物| 亚洲乱码中文字幕在线| 无码人妻一区二区三区免费手机| 亚洲国产成人久久精品影视| 久久不见久久见免费影院www日本| 国产美女无遮挡免费视频| 亚洲一级免费毛片| 免费播放特黄特色毛片| jzzijzzij在线观看亚洲熟妇| 国产成人免费爽爽爽视频| 亚洲成人免费在线观看| 日韩电影免费观看| 亚洲第一第二第三第四第五第六 | 亚洲视频中文字幕| 日本一区二区三区日本免费| 亚洲欧美国产欧美色欲|