package com.thread.test;
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;
import javax.annotation.Nullable;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
public class FutrueDemo {
public static void main(String[] args) throws InterruptedException {
// MoreExecutors.listeningDecorator:将一个普通的线程池包装成一个含通知功能的Future线程池
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
// 将任务提交到线程池并得到ListenableFuture
ListenableFuture<String> futrue = service.submit(new RealDate("x"));
// 添加回调函数,当Futrue执行完成后,执行回调代码
futrue.addListener(() -> {
System.out.println("异步处理成功:");
try {
System.out.println(futrue.get());
} catch (Exception e) {
e.printStackTrace();
}
}, MoreExecutors.directExecutor());
// 增加了异常处理
Futures.addCallback(futrue, new FutureCallback<String>() {
@Override
public void onSuccess(@Nullable String result) {
System.out.println("异步处理成功,result=" + result);
try {
System.out.println("异步处理成功:" + futrue.get());
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable t) {
System.out.println("异步处理失败,t=" + t);
}
}, MoreExecutors.newDirectExecutorService());
// 使用了上述任一一种回调机制后,此行一启动就直接打印,不会受到futrue.get()而阻塞
System.out.println("main futrue done...");
Thread.sleep(3000);
}
static class RealDate implements Callable<String> {
private String para;
public RealDate(String para) {
this.para = para;
}
@Override
public String call() throws Exception {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 10; i++) {
sb.append(para);
Thread.sleep(100);
}
return sb.toString();
}
}
}