<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 | 百家樂訊特
    學習了··謝謝!  回復  更多評論
      
    主站蜘蛛池模板: 国产免费拔擦拔擦8X高清在线人 | 免费VA在线观看无码| 国产中文字幕免费观看| www成人免费观看网站| 亚洲精品中文字幕无乱码| 精品久久久久久久免费加勒比| eeuss草民免费| 亚洲伊人久久精品| 亚洲国产香蕉人人爽成AV片久久 | 亚洲av午夜福利精品一区| 四虎影视免费在线| 特级做A爰片毛片免费看无码| 激情综合亚洲色婷婷五月| 亚洲区日韩区无码区| 黄色成人免费网站| av电影在线免费看| 国产人成亚洲第一网站在线播放| 国产亚洲情侣一区二区无| 性短视频在线观看免费不卡流畅 | 无码精品A∨在线观看免费| g0g0人体全免费高清大胆视频| 亚洲一卡二卡三卡| 亚洲av无码一区二区三区不卡| 日本一道在线日本一道高清不卡免费| 在线看片免费人成视频播| 国产精品成人亚洲| 亚洲欧洲日本在线观看| 亚洲AV无码一区二区二三区软件| 国产精品美女自在线观看免费| 中国xxxxx高清免费看视频| 精品一区二区三区免费观看| 亚洲男同gay片| 亚洲欧洲高清有无| 亚洲AV无码乱码国产麻豆穿越| 亚洲精品国产日韩无码AV永久免费网 | 国产精品亚洲专一区二区三区| 亚洲欧洲日产国产最新| 亚洲大成色www永久网站| 亚洲免费在线观看| 国产免费直播在线观看视频| 一二三四在线播放免费观看中文版视频 |