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

TAGS: 示例代码 Guava并发 ListenableFuture RateLimiter

欢迎使用万千站长工具!

Welcome to www.zzTool.com