博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入浅出Future Pattern
阅读量:7223 次
发布时间:2019-06-29

本文共 3448 字,大约阅读时间需要 11 分钟。

hot3.png

Future是这样一种Pattern: 它本身表示‘将来(future)’

你提交一个异步的任务  比如提交到一个threadpool

与此同时拿到一个Future对象  任务的执行是异步的

这时候你可以去做其它的事情  等到异步任务结束的时候  你可通过前面的Future对象拿到异步执行的任务的结果

import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.FutureTask; public class FutureTest {     public static void main(String[] args) {    ExecutorService executor = Executors.newFixedThreadPool(1);     Future< String> future = executor.submit(new Callable< String>() {      public String call() {        return "Hello futue!";      }    });             try {      Thread.sleep(1000);      System.out.println(future.get());    } catch (InterruptedException e) {      future.cancel(true);    } catch (ExecutionException e) {      future.cancel(true);    } finally {      executor.shutdown();    }  }}

异步执行结束后,自动通知用户异步任务结束了,你可以通过Future来获取执行结果了。

这就诞生了google的ListenableFuture,用户可以向它注册一个回调函数和提供一个线程池(可选),

当异步任务执行结束后,它会自动在用户提供的线程池里调用用户注册的回调函数,通知用户异步任务执行结束了。

当然,如果用户不提供线程池,它会在运行异步任务的工作线程里运行回调函数,

这种情况适用于工作线程本身的任务比较轻量级的情景。

import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.Executors; 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; public class ListenableFutureTest {     public static void main(String[] args) {    ListeningExecutorService executor = MoreExecutors.listeningDecorator(        Executors.newFixedThreadPool(1));             final ListenableFuture< String> future = executor.submit(          new Callable< String>() {            public String call() throws Exception {              return "Hello listenable future";            }      });           future.addListener(new Runnable() {      public void run() {        try {          System.out.println(future.get());        } catch (InterruptedException e) {          future.cancel(true);        } catch (ExecutionException e) {          future.cancel(true);        }      }    }, Executors.newFixedThreadPool(1));     System.out.println("exit..");  }}

import java.util.concurrent.Callable;import java.util.concurrent.Executors; 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; public class ListenableFutureTest2 {     public static void main(String[] args) {    ListeningExecutorService executor = MoreExecutors.listeningDecorator(        Executors.newFixedThreadPool(1));             final ListenableFuture< String> future = executor.submit(          new Callable< String>() {          public String call() throws Exception {            return "Hello listenable future";      }    });         Futures.addCallback(future, new FutureCallback< String>() {      public void onSuccess(String result) {        System.out.println(result);      }             public void onFailure(Throwable t) {        System.out.println("error: " + t);       }            }, Executors.newFixedThreadPool(1));                   System.out.println("exit..");  }}

转载于:https://my.oschina.net/darionyaphet/blog/282533

你可能感兴趣的文章
内网ntp时间同步配置
查看>>
C#高级编程9-第3章 对象与类型
查看>>
CSS3 Notes: -webkit-box-reflect实现倒影
查看>>
OpenCV
查看>>
递归复制&查看文件夹下的指定后缀的文件
查看>>
MySQL Replication
查看>>
MVC3网站发布
查看>>
Linq学习之旅——Linq to Objects之立即执行方法(下篇)
查看>>
Git团队协作 - 新feature的开发过程
查看>>
【定时操作】之XCOPY
查看>>
源码分析:Java堆的创建
查看>>
重写Repeater,使其支持空模版(列表为空时显示) 。改进
查看>>
[Python3网络爬虫开发实战] 1.9.3-Scrapyd-Client的安装
查看>>
3160 最长公共子串
查看>>
poj2816
查看>>
20159208《网络攻防与实践》第十一周学习总结
查看>>
代码自动生成工具MyGeneration之一
查看>>
触发器
查看>>
DBUtil
查看>>
准备学习后缀数组 先存一个论文里的模板
查看>>