技术文摘
Guava并发之ListenableFuture与RateLimiter示例
2024-12-31 17:43:54 小编
Guava并发之ListenableFuture与RateLimiter示例
在Java并发编程中,Guava库提供了一些强大的工具,其中ListenableFuture和RateLimiter尤为引人注目。它们分别在异步编程和限流控制方面有着出色的表现。
ListenableFuture是对传统Future的扩展,它允许我们为异步操作的完成添加回调函数。传统的Future在获取结果时会阻塞当前线程,直到任务完成。而ListenableFuture则可以在任务完成时自动触发回调,使得我们的代码更加灵活和高效。
下面是一个简单的ListenableFuture示例。假设我们有一个耗时的任务,比如从远程服务器获取数据:
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
public class ListenableFutureExample {
public static void main(String[] args) {
ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
ListenableFuture<String> future = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
// 模拟耗时操作
Thread.sleep(2000);
return "数据获取成功";
}
});
future.addListener(() -> {
try {
System.out.println(future.get());
} catch (Exception e) {
e.printStackTrace();
}
}, executorService);
}
}
RateLimiter则用于限制操作的执行速率。在某些场景下,我们可能不希望某些操作过于频繁地执行,比如访问外部接口时避免短时间内大量请求导致服务过载。
示例代码如下:
import com.google.common.util.concurrent.RateLimiter;
public class RateLimiterExample {
public static void main(String[] args) {
RateLimiter rateLimiter = RateLimiter.create(1.0);
for (int i = 0; i < 10; i++) {
rateLimiter.acquire();
System.out.println("执行任务:" + i);
}
}
}
在上述代码中,我们创建了一个每秒允许执行一次操作的RateLimiter。通过调用acquire方法,当操作超过速率限制时,线程会阻塞等待。
Guava的ListenableFuture和RateLimiter为我们的并发编程提供了便利和强大的功能。合理使用它们可以提高程序的性能和稳定性。
- ColdFusionMX 编程之循环指南
- VBA 实现 Excel 依据某一列拆分多个文件
- ColdFusionMX 编程指引:ColdFusionMX Basic Tag 编程
- VBA 编程入门基础
- Ruby 程序中调用 REXML 解析 XML 格式数据的实例用法解析
- Excel VBA 中限制工作表滚动区域的代码
- 通过 VBA 将记录集导出至 Excel 模板
- VBA 所需常数 第 1/2 页
- Ruby 借助 REXML 库解析 xml 格式数据的方法
- Python 中二三维曲面与矢量流线图绘制的代码实例
- 外网 IP 获取与指定邮箱发送脚本
- Ruby 编程中设计模式之观察者模式的运用实例剖析
- Ruby 网页图片抓取的实现
- Ruby 设计模式开发中观察者模式的实例实现解析
- 探究 Ruby 设计模式开发中 proxy 代理模式的应用