多线程最佳实践

异步线程阻塞等待完成

当你遇到一个场景,需要同时启动多个任务,并等待所有任务完成后执行后续操作。这个方法很有用,比如你需要执行三个下载任务,当三个任务都下载完成后你才通知界面说完成,这个时候如果一个个去下载肯定耗时非常高,我们可以同时起三个线程去并行执行任务,减少总的执行时间。

下面是一段例子代码:

// 模拟N个下载任务列表
ArrayList<Object> downloadTaskList = new ArrayList<>();
List<CompletableFuture<Void>> futureList = downloadTaskList.stream().map(downloadParam -> CompletableFuture.runAsync(() -> {
            // 下载任务
            downloadTask(downloadParam);
        })).collect(Collectors.toList());
        // 等待所有异步任务完成
        CompletableFuture<Void> allOf = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]));
        // 阻塞等待所有结果
        allOf.join();
        //执行其他操作

2个异步线程执行完后阻塞

		// 创建第一个异步任务
        CompletableFuture<String> future1 = CompletableFuture.runAsync(() -> {
            try {
                System.out.println("Task 1 is running");
                Thread.sleep(2000); // 模拟任务执行
                return "Task 1 is completed";
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // 创建第二个异步任务
        CompletableFuture<String> future2 = CompletableFuture.runAsync(() -> {
            try {
                System.out.println("Task 2 is running");
                Thread.sleep(3000); // 模拟任务执行
                return "Task 2 is completed";
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // 创建一个CompletableFuture,等待两个异步任务都完成
        CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2);
		allTasks.thenRun(() -> {
             try {
                 // 获取任务结果
                 String result1 = future1.get();
                 String result2 = future2.get();
                // 在此进行后续操作
                    
             } catch (Exception e) {
                 log.error("任务执行异常", e);
             }
		}).join();
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值