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