Guava 6:Concurrency
一、引子
有点经验的工程师一定对多线程比较熟悉,JDK封装的FutureTask实现了这一功能。如下图:

FutureTask实现了RunnableFuture接口,而RunnableFuture接口继承了Future+Runnable共2个接口。因此,FutureTask支持线程执行任务run(),也支持get()等待任务完成、cancel()取消任务等。但是明显还是不够。
Guava的并发包,强大而简单的抽象,让编写正确的并发代码更简单
1.ListenableFuture接口
ListenableFuture接口并继承了JDK concurrent包下的Future 接口。配合Futures工具类,可以很方便的实现以下功能:
1)监听任务执行结果并执行回调方法。
2)提供方便的任务接口转换。
3)多线程并发执行取结果集合。
2.Service框架
抽象可开启和关闭的服务,帮助你维护服务的状态逻辑
二、简单应用
2.1 ListenableFuture接口
2.1.1 监听任务执行结果并执行回调方法
实现功能:
1)定义监听执行器。
2)定义可监听的带返回值任务。
3)定义回调方法。
3)绑定任务、执行器、回调方法。
源码如下:
public static void main(String[] args) throws ExecutionException, InterruptedException {
/** 1.典型用法:可监听的future,带回调方法 */
// 定义监听执行服务
ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
// 定义可监听的带返回值的任务
ListenableFuture<String> callableListenableFuture1 = listeningExecutorService.submit(() -> {
System.out.println("callable1 call!");
return "1";
});
// 添加回调,由指定监听执行服务来执行,监听可监听的future,监听到事件时执行对应回调方法。
Futures.addCallback(callableListenableFuture1, new FutureCallback<String>() {
@Override
public void onSuccess(@Nullable String result) {
System.out.println("success,result=" + result);
}
@Override
public void onFailure(Throwable t) {
System.out.println("fail!");
}
}, listeningExecutorService);
}
打印结果:
callable1 call!
success,result=1
2.1.2 提供方便的任务接口转换
实现功能:
1) 定义一个需要绑定的ListenableFuture
2)定义一个异步转换方法
3)定义一个线程任务执行器
4)调用Futures工具类的transformAsync方法实现转换
源码如下:
public static void main(String[] args) throws ExecutionException, InterruptedException {
/** 2.非典型用法:异步转换 */
// 异步转换,参数1是需要转换的listenableFuture,参数2是转换方法,参数3是执行转换的线程执行器(Runnable)。
ListenableFuture<Integer> transform = Futures.transformAsync(callableListenableFuture1, new AsyncFunction<String, Integer>() {
@Override
public ListenableFuture<Integer> apply(@Nullable String input) {
return Futures.immediateFuture(Integer.parseInt(input));
}
}, MoreExecutors.directExecutor());
// 阻塞线程得到结果
System.out.println("阻塞获取转换后任务的结果:"+transform.get());
}
打印结果:
阻塞获取转换后任务的结果:1
2.1.3 多线程并发执行取结果集合
实现功能:
1)定义多个任务
2)调用Futures工具类的allAsList方法合并结果,返回一个总ListenableFuture,调用get方法即可实现多线程并发执行任务取结果集合,结果是list,顺序是按照提交任务的顺序。
源码如下:
public static void main(String[] args) throws ExecutionException, InterruptedException {
/** 3.典型用法:多任务并发执行取结果list */
// 可监听不带返回值的任务
ListenableFuture<String> callableListenableFuture2 = listeningExecutorService.submit(() -> {
Thread.sleep(3000);
System.out.println("callable2 call!");
return "2";
});
ListenableFuture<String> callableListenableFuture3 = listeningExecutorService.submit(() -> {
System.out.println("callable3 call!");
return "3";
});
ListenableFuture<List<String>> listListenableFuture = Futures.allAsList(
Lists.newArrayList(callableListenableFuture1, callableListenableFuture2, callableListenableFuture3));
// 返回结果list就是添加任务的顺序
System.out.println("多任务并发执行取结果list result=" + listListenableFuture.get());
}
打印结果:
callable1 call!
callable3 call!
callable2 call!
多任务并发执行取结果list result=[1, 2, 3]
2.2 Service框架
Guava包里的Service接口用于封装一个服务对象的运行状态,包括start和stop等方法。例如web服务器,RPC服务器、计时器等可以实现这个接口。对此类服务的状态管理在多线程环境下尤为复杂。Guava包提供了一些基础类帮助你管理复杂的状态转换逻辑和同步细节。这里不细节拓展,很少情况会用到这个框架。
三、总结
Guava 提供了ListenableFuture接口,结合Futures工具类,可以非常方便的实现并发任务,取结果list等方法,且API优雅易用,在特定场景,建议使用。
相反,Service框架,可能重量级的业务场景才可能使用到,简单场景没有必要使用。
Guava 6:Concurrency的更多相关文章
- Google Java编程库Guava介绍
本系列想介绍下Java下开源的优秀编程库--Guava[ˈgwɑːvə].它包含了Google在Java项目中使用一些核心库,包含集合(Collections),缓存(Caching),并发编程库(C ...
- [Java 缓存] Java Cache之 Guava Cache的简单应用.
前言 今天第一次使用MarkDown的形式发博客. 准备记录一下自己对Guava Cache的认识及项目中的实际使用经验. 一: 什么是Guava Guava工程包含了若干被Google的 Java项 ...
- [转载]Google Guava官方教程(中文版)
原文链接 译文链接 译者: 沈义扬,罗立树,何一昕,武祖 校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] ...
- Guava学习笔记(一)概览
Guava是谷歌开源的一套Java开发类库,以简洁的编程风格著称,提供了很多实用的工具类, 在之前的工作中应用过Collections API和Guava提供的Cache,不过对Guava没有一个系统 ...
- 使用Guava EventBus构建publish/subscribe系统
Google的Guava类库提供了EventBus,用于提供一套组件内publish/subscribe的解决方案.事件总线EventBus,用于管理事件的注册和分发.在系统中,Subscribers ...
- Guava学习-目录
备份一下地址: 目录 1. 基本工具 [Basic utilities] 让使用Java语言变得更舒适 1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服. ...
- Guava学习笔记:Google Guava 类库简介
http://www.cnblogs.com/peida/tag/Guava/ Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, cachin ...
- Guava学习笔记目录
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...
- Google Guava官方教程(中文版)
Google Guava官方教程(中文版) 原文链接 译文链接 译者: 沈义扬,罗立树,何一昕,武祖 校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库, ...
随机推荐
- 移动Web UI库(H5框架)
1.Framework7 Framework7 - is a free and open source mobile HTML framework to develop hybrid mobile a ...
- 用GraphX分析伴生网络(二)
8. 过滤噪声边 在当前的伴生关系中,边的权重是基于一对概念同时出现在一篇论文中的频率来计算的.这种简单的权重机制的问题在于:它并没有对一对概念同时出现的原因加以区分,有时一对概念同时出现是由于它们具 ...
- 【警告】WARN: Establishing SSL connection without server's identity verification is not recommended.
1.Java访问Mysql时出现如下警告: 2019-04-02 10:30:50.545 INFO 1290 --- [nio-8080-exec-1] com.zaxxer.hikari.Hika ...
- 另一道不知道哪里来的FFT题
给定一个序列,求出这个序列的k阶前缀和,模998244353,n<=1e5. k阶前缀和可以看成一个一个n*k的平面上的二维行走问题. 第i项对第j项的贡献是从(i,0)走到(j,k)的NE L ...
- js 获取getElementsTagName()方法返回值的内容
<div id="news-top" class="section"> <h3>Some title</h3> <di ...
- poj 3254Corn Fields (入门状压dp)
Farmer John has purchased a lush ≤ M ≤ ; ≤ N ≤ ) square parcels. He wants to grow some yummy corn fo ...
- 常用模块Part(2)
logging模块 hashlib模块 hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. # 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个 ...
- laravel5.5 调用系统自带登陆认证auth
1执行命令 php artisan make:auth 2 编辑文件 config/auth guardes 'admin' => [ 'driver' => 'session', 'pr ...
- 短信猫+kannel调试一例
同事做一短信网关平台,采用kannel软件. 安装正常,配置文件如下: # Vodafone 3G cardgroup = coreadmin-port = 13000admin-password = ...
- 网络编程-day1
一. *** C/S架构:客户端(client)/服务端(server)架构, B/S架构:浏览器(browser) / 服务端(server)架构 软件cs架构:浏览器,qq,微信,陌陌等等 硬件c ...