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项目广泛依赖 的核心库, ...
随机推荐
- DAY6 元组、字典与集合
一.元组 定义:t1 = (1, 2) # t1 = tuple((1,2)) 特点:有序存储.可存放多个数据.不可变(内部可以包含可变对象,可变对象已久可变) 应用场景:将不允许操作的列表可以转化为 ...
- 这可能是史上最全的css布局教程
标题严格遵守了新广告法,你再不爽,我也没犯法呀!话不多说,直入正题. 所谓布局,其实包含两个含义:尺寸与定位.也就是说,所有与尺寸和定位相关的属性,都可以用来布局. 大体上,布局中会用到的有:尺寸相关 ...
- 微信H5页面嵌入百度地图---解决手机的webKit定位,ios系统对非https网站不提供支持问题
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=yGQt ...
- 解决table宽度设置不起作用,由于内容问题被撑开 亲测 完美解决
1.在table 标签添加样式 table-layout: fixed; 必须设置width的值:<table style="table-layout: fixed"> ...
- windows10下安装mysql-8.0.15-winx64以及连接服务器过程中遇到的一些问题
一.下载安装配置mysql-8.0.15 1.官网(https://dev.mysql.com/downloads/mysql/)下载zip包 2.解包到我的D:\mysql目录下 3.为mysql配 ...
- js利用sort()方法实现数组排序
1.number类型排序 let aa = [1,11,2,4,3] aa.sort() console.log(aa) //[1,11,2,3,4] aa.sort((a,b)=>a-b) c ...
- 64位win7连接ACCESS报错“Microsoft.Jet.OLEDB.4.0”问题
本人开发了桌面软件,关于事务提醒,自己一直在用,很喜欢,但是在64位win7上无法运行,网上说多种方法,都觉得麻烦.后来自己在vs2012下编译成x86版本,结果可以运行在64位win7下了. 原来如 ...
- C语言:统计数字空格其他字符程序
#include <stdio.h> int main(){ char t; int num=0; int spac=0; int other=0; int sum=0; printf(& ...
- python3入门教程(二)操作数据库(一)
概述 最近在准备写一个爬虫的练手项目,基本想法是把某新闻网站的内容分类爬取下来,保存至数据库,再通过接口对外输出(提供后台查询接口).那么问题就来了,python到底是怎么去操作数据库的呢?我们今天就 ...
- 获取进程ID,父进程ID,进程完整路径
准备写一个进程管理的功能模块,今天下午先写了扫描获取本机各个进程路径,获取各个进程映像名称,进程完整路径. 要获取进程信息,第一步想到的就是提权,提权代码用过多次了,今天也小结了一下(http://w ...