Java之CompletableFuture 异步处理集合

Java异步处理集合

<dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.7.14</version>
</dependency>

/**
 * 多线程异步处理集合数据
 */
public class DemoList {
    //定义个线程池
    private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(20, 100, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(512));
    public static void main(String[] args){
        //1.定义随机插入一个10w集合数据
        List<Integer> dataList = new ArrayList<>();
        for (int i = 1; i <= 100000; i++) {
            dataList.add(i);
        }
        //计算消耗时间
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        //创建一个异步任务集合
        List<CompletableFuture> results = new ArrayList<>();
        //将集合进行分组,1000进行一次分组
        List<List<Integer>> partition = ListUtil.partition(dataList, 1000);
        for (int i1 = 0; i1 < partition.size(); i1++) {
            int finalI = i1;
            CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
                printNum(partition.get(finalI));
                return 1;
            }, executor);
            results.add(future);
        }
        // 等待所有的异步线程都完成
        CompletableFuture.allOf(results.toArray(results.toArray(new CompletableFuture[partition.size()]))).join();
        stopWatch.stop();
        executor.shutdown();
        System.out.println("总用时"+stopWatch.getTotalTimeMillis()+"毫秒");
    }
    public static void printNum(List<Integer> list ){
        for (int i = 0; i < list.size(); i++) {
            System.out.println("++++"+list.get(i));
        }
    }
}



  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中可以使用多线程或异步操作实现集合异步刷新。 一种方法是使用Java的线程池来异步执行集合刷新操作。可以使用ExecutorService类来创建线程池,并将需要异步刷新的集合对象包装为Callable对象以便能够提交给线程池执行。在Callable对象的call()方法中执行集合刷新操作,然后将结果返回。 另一种方法是使用Java 8中的CompletableFuture类来异步执行集合刷新操作。可以使用CompletableFuture.supplyAsync()方法将需要异步刷新的集合对象包装为Supplier对象,然后在异步线程中执行集合刷新操作,并返回结果。可以使用CompletableFuture.thenAccept()方法在主线程中处理异步结果。 以下是一个示例代码: ```java import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class AsyncCollectionRefresh { private List<String> list = new ArrayList<>(); private ExecutorService executor = Executors.newSingleThreadExecutor(); public AsyncCollectionRefresh() { list.add("item1"); list.add("item2"); list.add("item3"); } public void refresh() { Callable<List<String>> callable = () -> { // Simulate refresh operation Thread.sleep(1000); List<String> newList = new ArrayList<>(); newList.add("item4"); newList.add("item5"); newList.add("item6"); return newList; }; Future<List<String>> future = executor.submit(callable); try { list = future.get(); System.out.println("List refreshed: " + list); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { AsyncCollectionRefresh asyncCollectionRefresh = new AsyncCollectionRefresh(); asyncCollectionRefresh.refresh(); } } ``` 该示例中,通过Callable对象异步执行集合刷新操作。在模拟的刷新操作中,新建了一个List对象,然后将其赋值给集合对象。最后在主线程中输出刷新后的集合内容。 另外,也可以使用Java 8中的Stream API来进行集合异步处理。使用Stream.parallel()方法可以将集合转换为并行流,从而实现多线程并发处理。但这种方法不太适用于集合的刷新操作,因为它需要重新创建一个新的流对象。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值