技术文摘
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为我们的并发编程提供了便利和强大的功能。合理使用它们可以提高程序的性能和稳定性。