文档章节

深入浅出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
08/10
0
0
Java基础巩固笔记(8)-多线程之线程并发库

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

卟想苌亣
2017/12/04
0
0
Future模式,探讨mina中的Iofuture

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

付翔
2010/06/19
0
0
RxJava & RxAndroid备忘

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

SuShine
2015/10/20
2.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux 中不适用功能键切换TTY

本简要指南介绍了在类 Unix 操作系统中如何在不使用功能键的情况下切换 TTY。在进一步讨论之前,我们将了解 TTY 是什么。正如在 AskUbuntu 论坛的一个答案[1]中所提到的,TTY这个词来自 Tele...

问题终结者
14分钟前
0
0
OSChina 周三乱弹 —— 我自己总觉得我的灵魂有毒

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Devoes :分享王菲的单曲《匆匆那年 (Fleet of Time)》 《匆匆那年 (Fleet of Time)》- 王菲 手机党少年们想听歌,请使劲儿戳(这里) 天长地...

小小编辑
20分钟前
3
3
深度学习与图像处理实例:人像背景虚化与背景替换

简单人像背景虚化处理思路如下: 对图像内容分割,提取人像,背景 背景模糊处理 人像与模糊处理后的背景融合 本实例使用DeepLabV3图像分割深度学习模型实现。代码如下: import numpy as np...

IOTService
昨天
0
0
八月新增开源项目:假装自己是图形界面的 Git 命令行工具

每月新增开源项目。顾名思义,每月更新一期。我们会从社区上个月新收录的开源项目中,挑选出有价值的、有用的、优秀的、或者好玩的开源项目来和大家分享。数量不多,但我们力求推荐的都是精品...

编辑部的故事
昨天
8
0
20180918 find命令与Linux文件扩展名

命令find 用来查找搜索文件。 搜索文件相关命令: which 从环境变量里的目录中去搜索 whereis(不常用) 从一个固定的库中搜索 locate(需要单独安装 yum install -y mlocate) 查询时会从/var/...

野雪球
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部