文档章节

深入浅出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
东城
程序员
私信 提问
多线程程序设计学习(10)Future pattern

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

无信不立
2015/07/23
0
0
java 操作HBase的管理API

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

Xuewu
2018/08/10
0
0
深入浅出Rust Future - Part 1

本文译自Rust futures: an uneducated, short and hopefully not boring tutorial - Part 1,时间:2018-12-02,译者:motecshine, 简介:motecshine 欢迎向Rust中文社区投稿,投稿地址,好文将...

krircc
2018/12/03
0
0
Java基础巩固笔记(8)-多线程之线程并发库

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

卟想苌亣
2017/12/04
0
0
深入浅出Rust Future - Part 2

译自Rust futures: an uneducated, short and hopefully not boring tutorial - Part 2时间:2018-12-03,译者: motecshine, 简介:motecshine 欢迎向Rust中文社区投稿,投稿地址 ,好文将在以......

krircc
2018/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
3
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
2
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
1
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
3
0
跟我学Spring Cloud(Finchley版)-15-Hystrix监控详解

Hystrix提供了监控Hystrix Command的能力,本节来详细探讨。 监控端点与数据 应用整合Hystrix,同时应用包含spring-boot-starter-actuator 依赖,就会存在一个/actuator/hystrix.stream 端点...

周立_ITMuch
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部