guava list 分段异步执行 示例
下面是一个使用Guava List分段和异步执行的示例:
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.*;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
public class GuavaListAsyncExample {
public static void main(String[] args) throws Exception {
List<Integer> numbers = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));
List<ListenableFuture<Integer>> futures = Lists.newArrayList();
// 将列表分段,每个段由一个Callable任务处理
List<List<Integer>> partitions = Lists.partition(numbers, 3);
for (final List<Integer> partition : partitions) {
ListenableFuture<Integer> future = executorService.submit(new Callable<Integer>() {
public Integer call() throws Exception {
// 在这里执行每个分段的任务
int sum = 0;
for (Integer num : partition) {
sum += num;
}
return sum;
}
});
futures.add(future);
}
// 使用Futures.allAsList来获取所有异步任务的结果
ListenableFuture<List<Integer>> allFutures = Futures.allAsList(futures);
// 添加回调函数,当所有任务完成时打印结果
Futures.addCallback(allFutures, new FutureCallback<List<Integer>>() {
public void onSuccess(List<Integer> result) {
int totalSum = 0;
for (Integer sum : result) {
totalSum += sum;
}
System.out.println("Total sum: " + totalSum);
}
public void onFailure(Throwable t) {
System.out.println("Error occurred while calculating sum: " + t.getMessage());
}
}, executorService);
// 关闭线程池
executorService.shutdown();
}
}
在这个示例中,我们首先创建一个包含1到10的整数列表。然后,我们使用Lists.partition方法将列表分为每个包含3个元素的分段。接下来,我们使用ListeningExecutorService创建一个线程池,并将每个分段的处理任务提交给线程池执行。每个任务计算分段内整数的总和。我们将每个任务的ListenableFuture添加到一个列表中。然后,我们使用Futures.allAsList方法获取所有异步任务的结果的ListenableFuture。最后,我们使用Futures.addCallback方法添加一个回调函数,在所有异步任务完成后打印结果
原文地址: https://www.cveoy.top/t/topic/ivG5 著作权归作者所有。请勿转载和采集!