利用completablefuture异步执行并发任务,并堵塞,全部完成后获取返回结果。

代码很简单,简单来说也就是。先创建一个线程池类,然后再写一个并发任务执行就可以了。因为此并发任务是利用

qvVerifyAsyncPool线程池处理的。

核心为,

        //定义线程返回结果
        List<CompletableFuture<String>> futures = new ArrayList<CompletableFuture<String>>();

 然后执行多个并发,同时将任务返回结果添加到此结果集合中

     CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
                //任务

                return 1;
            },qvVerifyAsyncPool);

 添加并发任务结果

 futures.add(future);

 堵塞当所有的任务完成时返回结果

        //阻塞等待结果返回
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
        List<String> result = allFutures.thenApply(v -> futures.stream().map(CompletableFuture::join).collect(Collectors.toList())).join();

 完整代码如下:

该线程池类代码如下:

@Configuration
@EnableAsync
public class AsyncConfiguration {


    /**
     * 报告线程池--整个报告
     * @return ThreadPoolTaskExecutor
     */
    @Bean(name = "qvVerifyAsyncPool")
    public ThreadPoolExecutor QvVerifyAsyncPool(){
        return new ThreadPoolExecutor(
                //核心线程数
                qvCorePoolSize,
                //最大线程数
                qvMaxPoolSize,
                qvKeepAliveSeconds,
                TimeUnit.SECONDS,
                //队列大小
                new LinkedBlockingDeque<Runnable>(qvQueueCapacity),
                //定义线程名称
                new ThreadFactory() {
                    private final AtomicInteger mThreadNum = new AtomicInteger(1);
                    @Override
                    public Thread newThread(Runnable r) {
                        return new Thread(r, "qvVerifyAsyncPool-" + mThreadNum.getAndIncrement());
                    }
                },
                //拒绝策略
                new ThreadPoolExecutor.AbortPolicy()
        );
    }
}
     /**
     * 简单Java并行代码
     * @param
     */
    public List<Integer> simpleParallel(){

        List<CompletableFuture<Integer>> futures = new ArrayList<>();
        for (int i = 0; i <10 ; i++) {
            CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
                System.out.println("有返回值的异步任务"+Thread.currentThread().getName());
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                return 1;
            },qvVerifyAsyncPool);

            futures.add(future);
        }

        // 使用allOf方法来表示所有的并行任务
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(
                futures.toArray(new CompletableFuture[futures.size()]));


        // 下面的方法可以帮助我们获得所有子任务的处理结果
        CompletableFuture<List<Integer>> finalResults = allFutures.thenApply(v ->
                futures.stream().map(CompletableFuture::join).collect(Collectors.toList())
        );
        List<Integer> resultList =  finalResults.join();

        System.out.println(resultList);

        return resultList;
    }

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,假设有以下的Java代码: ```java public class Counter { private int count; public void increment() { count++; } public int getCount() { return count; } } ``` 这是一个简单的计数器类,其中有一个increment()方法用于对计数器进行加一操作,另外有一个getCount()方法用于获取计数器的当前值。 现在假设多个线程同时对这个计数器进行操作,就会出现并发访问的问题,可能会导致计数器的结果出错。 为了解决这个问题,可以使用Java中的CompletableFuture来实现异步编程,并且保证线程安全。具体的实现方式可以通过使用AtomicInteger类来保证计数器的线程安全,修改后的代码如下所示: ```java public class Counter { private AtomicInteger count = new AtomicInteger(0); public void increment() { CompletableFuture.runAsync(() -> { count.incrementAndGet(); }); } public CompletableFuture<Integer> getCountAsync() { return CompletableFuture.supplyAsync(() -> { return count.get(); }); } } ``` 在这个代码中,increment()方法使用CompletableFuture.runAsync()方法来异步执行计数器加一操作,并且使用AtomicInteger类来保证线程安全。getCountAsync()方法也使用CompletableFuture.supplyAsync()方法来异步获取计数器的值。 使用异步编程可以将计算密集型的操作放在后台线程中进行,从而避免阻塞主线程,提高系统的并发处理能力。同时使用AtomicInteger类可以保证计数器的线程安全。当然,异步编程也需要注意一些问题,比如异常处理等,需要根据实际情况进行选择和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值