文档章节

深入浅出Future Pattern

散关清渭
 散关清渭
发布于 2014/06/20 21:54
字数 567
阅读 33
收藏 0
点赞 0
评论 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基础巩固笔记(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
干货 | 自然语言处理入门资料推荐

微信公众号 关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 源 | AI深入浅出 最近几个月小编遨游在税务行业的智能问答...

mbx8x9u
01/02
0
0
java基础巩固笔记(5)-多线程之线程并发库

java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述包下的相关类和使用方法 Package java.util.concurrent 原子性操作类 包下的类: Package java.util.concurrent.atom...

brianway
2016/02/06
1K
0
node.js中长连接遇到的坑

近日尝试使用node.js的长连接去模拟微信的扫码登录,但是每次超时重连都遇到“socket hang up”的错误,警告一番查阅资料后,终于发现是node.js的连接池惹的祸。 模拟微信登录的核心代码: ...

cloes
2016/09/22
231
1
The Design of HDFS

HDFS is a filesystem designed for storing very large files with streaming data access patterns, running on clusters of commodity hardware. Let’s examine this statement in more ......

杨尚川
2015/04/08
0
0
Thinking, Consciousness and a Model of Intelligence

Introduction At the time I write this article, December 2017, I couldn't find a similar approach in the public space. There are a lot of descriptions of the neurons, going into ......

Adrian Pirvu
2017/12/20
0
0
Racket 6.6 发布,Lisp 语言分支

Racket 6.6 发布,更新如下: The new Macro Profiler command-line tool () shows how macros contribute to the final expanded code size of a program. Typed Racket supports intersec......

oschina
2016/07/25
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
12
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
2
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部