文档章节

深入浅出Future Pattern

散关清渭
 散关清渭
发布于 2014/06/20 21:54
字数 567
阅读 33
收藏 0

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..");
  }}










本文转载自:http://www.wuzesheng.com/?p=2485

共有 人打赏支持
散关清渭
粉丝 24
博文 238
码字总数 166498
作品 0
东城
程序员
私信 提问
java 操作HBase的管理API

HBase的管理Java API 中止服务器或客户端。 检查服务器或客户端是否已中止。 返回此对象使用的连接。 判断表述否已存在,不存在则创建表 列出所有用户空间表 正则匹配查询所有的表 列出用户空...

Xuewu
08/10
0
0
多线程程序设计学习(10)Future pattern

Future pattern[订单取货模式] 一:Future pattern的参与者 --->Client(客户需求) --->Host(蛋糕门店) --->Data(票据和蛋糕的接口) --->Future(蛋糕票据) --->ReaData(制作蛋糕过程) ...

无信不立
2015/07/23
0
0
Future模式,探讨mina中的Iofuture

2010-02-09 Future模式文章分类:Java编程 在mina中有各种各样的future,如果不知道这背后的future模式,那么对mina的理解就不可能深入。 什么是future模式呢? 经常有一个线程需要得到另个一...

付翔
2010/06/19
0
0
Java基础巩固笔记(8)-多线程之线程并发库

Contents java基础巩固笔记(5)-多线程之线程并发库 原子性操作类 线程池 Lock&Condition 同步工具 参考资料 本文主要概述包下的相关类和使用方法 Package java.util.concurrent 原子性操作类...

卟想苌亣
2017/12/04
0
0
RxJava & RxAndroid备忘

“你问我要去向何方,我指着大海的方向” 今天在刷G+的时候看到Dave Smith推荐了一个视频 《Learning RxJava (for Android) by example》 点进去看了一下,原来是位熟悉的”阿三哥”,视频封...

SuShine
2015/10/20
2.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

MariaDB 服务器在 MySQL Workbench 备份数据的时候出错如何解决

服务器是运行在 MariaDB 10.2 上面的,在使用 MySQL Workbench 出现错误: mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"'......

honeymose
今天
3
0
apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
今天
6
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
14
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
4
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部