Guava并发:ListenableFuture与RateLimiter示例

简介:

概念

        ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强。我们知道Future表示一个异步计算任务,当任务完成时可以得到计算结果。如果我们希望一旦计算完成就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。这样做,代码复杂,而且效率低下。使用ListenableFuture Guava帮我们检测Future是否完成了,如果完成就自动调用回调函数,这样可以减少并发程序的复杂度。      

        推荐使用第二种方法,因为第二种方法可以直接得到Future的返回值,或者处理错误情况。本质上第二种方法是通过调动第一种方法实现的,做了进一步的封装。

另外ListenableFuture还有其他几种内置实现:

  1. SettableFuture:不需要实现一个方法来计算返回值,而只需要返回一个固定值来做为返回值,可以通过程序设置此Future的返回值或者异常信息

  2. CheckedFuture: 这是一个继承自ListenableFuture接口,他提供了checkedGet()方法,此方法在Future执行发生异常时,可以抛出指定类型的异常。


    RateLimiter类似于JDK的信号量Semphore,他用来限制对资源并发访问的线程数,本文介绍RateLimiter使用

代码示例

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

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;
import com.google.common.util.concurrent.RateLimiter;

public class ListenableFutureDemo {
	public static void main(String[] args) {
		testRateLimiter();
		testListenableFuture();
	}

	/**
	 * RateLimiter类似于JDK的信号量Semphore,他用来限制对资源并发访问的线程数
	 */
	public static void testRateLimiter() {
		ListeningExecutorService executorService = MoreExecutors
				.listeningDecorator(Executors.newCachedThreadPool());

		RateLimiter limiter = RateLimiter.create(5.0); // 每秒不超过4个任务被提交

		for (int i = 0; i < 10; i++) {
			limiter.acquire(); // 请求RateLimiter, 超过permits会被阻塞

			final ListenableFuture<Integer> listenableFuture = executorService
					.submit(new Task("is "+ i));
		}
	}

	public static void testListenableFuture() {
		ListeningExecutorService executorService = MoreExecutors
				.listeningDecorator(Executors.newCachedThreadPool());

		final ListenableFuture<Integer> listenableFuture = executorService
				.submit(new Task("testListenableFuture"));

		
		//同步获取调用结果
		try {
			System.out.println(listenableFuture.get());
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		} catch (ExecutionException e1) {
			e1.printStackTrace();
		}
		
		//第一种方式
		listenableFuture.addListener(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println("get listenable future's result "
							+ listenableFuture.get());
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (ExecutionException e) {
					e.printStackTrace();
				}
			}
		}, executorService);

		//第二种方式
		Futures.addCallback(listenableFuture, new FutureCallback<Integer>() {
			@Override
			public void onSuccess(Integer result) {
				System.out
						.println("get listenable future's result with callback "
								+ result);
			}

			@Override
			public void onFailure(Throwable t) {
				t.printStackTrace();
			}
		});
	}
}

class Task implements Callable<Integer{
	String str;
	public Task(String str){
		this.str = str;
	}
	@Override
	public Integer call() throws Exception {
		System.out.println("call execute.." + str);
		TimeUnit.SECONDS.sleep(1);
		return 7;
	}
}

Guava版本

<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>14.0.1</version>
		</dependency>
目录
相关文章
|
XML Java Unix
setting.xml配置文件详解
maven是JAVA开发人员经常使用的工具之一,最核心的配置文件是setting.xml,本文对setting.xml做简要分析,梳理xml每个节点的说明。
1926 1
|
应用服务中间件 nginx
nginx开发(二)配置mp4文件在线播放
1: 第一步先开打nginx的文件夹遍历功能   vi /usr/local/nginx/conf/nginx.conf #编辑配置文件,在http {下面添加以下内容: autoindex on; #开启nginx目录浏览功能 autoindex_exact_size off; #文件大小...
3673 0
|
5月前
|
关系型数据库 分布式数据库 数据库
阿里云PolarDB数据库蝉联SIGMOD最佳论文奖
阿里云PolarDB凭借全球首创基于CXL Switch的分布式内存池技术,在SIGMOD 2025上荣获工业赛道“最佳论文奖”,连续两年蝉联该顶会最高奖项。其创新架构PolarCXLMem打破传统RDMA技术瓶颈,性能提升2.1倍,并已落地应用于内存池化场景,推动大模型推理与多模态存储发展,展现CXL Switch在高速互联中的巨大潜力。
阿里云PolarDB数据库蝉联SIGMOD最佳论文奖
|
缓存 Java 开发者
SpringBoot自动装配原理
SpringBoot自动装配原理
834 1
curl: symbol lookup error: curl: undefined symbol: curl_mime_free
curl: symbol lookup error: curl: undefined symbol: curl_mime_free
1125 0
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
710 6
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】Transformers大模型库(一):Tokenizer
【AI大模型】Transformers大模型库(一):Tokenizer
551 1
|
存储 关系型数据库 MySQL
MySQL的MyISAM引擎:技术特点与应用场景
【4月更文挑战第20天】MySQL的MyISAM引擎特点是表级锁定,适合读多写少的场景,不支持事务但提供全文索引,适用于只读应用、全文搜索和简单备份恢复。在选择存储引擎时,应根据具体需求权衡。
1227 11