CompletableFuture异步线程

  1. CompletableFuture使用
package com.infoextraction.controller;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import java.io.*;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

@Controller
public class HelloController {
    public static ExecutorService executor= Executors.newFixedThreadPool(10);
    private static Logger logger = LoggerFactory.getLogger(HelloController.class);
	/**
	 *
	 *异步执行无返回值
	 */
    public static void main(String[] args) {
        CompletableFuture.runAsync(()->{
            Thread.currentThread().getId();
            //代码逻辑
            int i=10/2;
            System.out.println("运行结果:"+i);
        },executor);
    }
}
  /**
     * 方法完成后返回值
     * @param args
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            //代码逻辑
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
        }, executor);
        Integer result = integerCompletableFuture.get();
        logger.info("处理完后返回的结果为{}",result);
    }
/**
     * 方法完成执行完成后感知
     * @param args
     * @throws ExecutionException
     * @throws InterruptedException
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            //代码逻辑 (如果想要测试异常处理则可以将2改为0  0不能最为除数所以会抛异常)
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
            //result 返回结果  exception 异常信息
        }, executor).whenComplete((result,exception)->{
            //whenComplete 虽然可以得到异常信息  但是无法修改返回数据
            logger.info("异步任务完成了。。结果是{},异常是{}",result,exception);
        }).exceptionally(throwable -> {
            //exceptionally 可以感知异常,同时返回默认值
            return 10;
        });
        Integer integer = integerCompletableFuture.get();
        logger.info("最终结果为{}",integer);
    }
  /**
     * 方法完成执行完成后处理 :handle无论是执行成功还是失败都可以处理
     * @param args
     * @throws ExecutionException
     * @throws InterruptedException
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            //代码逻辑
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
            //result 返回结果  exception 异常信息
        }, executor).handle((result,exception)->{
            //对结果进行处理
            if(result!=null){
                //执行逻辑
                return result*2;
            }
            //对异常进行处理
            if(exception!=null){
                //处理逻辑
                return 0;
            }
            return 0;
        });
        //打印处理结果
        Integer reslut = integerCompletableFuture.get();
        logger.info("处理结果为{}",reslut);
    }
  /**
     * 线程串行化
     * @param args
     */
    public static void main(String[] args) {

        CompletableFuture<Void> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
        Thread.currentThread().getId();
        logger.info("任务A开始执行");
        //代码逻辑
        int i = 10 / 2;
        System.out.println("运行结果:" + i);
        return i;
        //thenRunAsync 任务A执行完执行任务B 但是无法获取到上一步任务A的执行结果且无返回值
        },executor).thenRunAsync(()->{
        logger.info("任务B开始执行");
        System.out.println("111");
        },executor);
    }
  /**
     * 线程串行化
     * @param args
     */
    public static void main(String[] args) {

        CompletableFuture<Void> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
        Thread.currentThread().getId();
        logger.info("任务A开始执行");
        //代码逻辑
        int i = 10 / 2;
        System.out.println("运行结果:" + i);
        return i;
        //thenAcceptAsync 任务A执行完执行任务B 可以获取到任务A的返回值但是无返回值
        },executor).thenAcceptAsync((res)->{
        logger.info("任务B开始执行,获取到任务A的返回结果为{}",res);
        logger.info("执行任务B逻辑11222233344");
        },executor);
    }
    /**
     * 线程串行化
     * @param args
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<String> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
        Thread.currentThread().getId();
        logger.info("任务A开始执行");
        //代码逻辑
        int i = 10 / 2;
        System.out.println("运行结果:" + i);
        return i;
        //thenAcceptAsync 任务A执行完执行任务B 即可以获取到上一步任务A的执行结果且有返回值
        },executor).thenApplyAsync((res)->{
        logger.info("任务B开始执行,获取到任务A的返回结果为{}",res);
        return "Hello "+res;
        },executor);
        logger.info(integerCompletableFuture.get());
    }
 /**
     * 两个任务组合
     * @param args
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Integer> taskA = CompletableFuture.supplyAsync(() -> {
        Thread.currentThread().getId();
        logger.info("任务A开始执行");
        //代码逻辑
        int i = 10 / 2;
        System.out.println("运行结果:" + i);
        return i;
        //thenAcceptAsync 任务A执行完执行任务B 即可以获取到上一步任务A的执行结果且有返回值
        },executor);
        CompletableFuture<String> taskB = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            logger.info("任务B开始执行");
            return "Hello";
        },executor);
        //组合任务A任务B完成后  任务A任务B组合执行后执行任务C 但是runAfterBothAsync 
        //获取不到 组合任务A任务B的执行结果
        taskA.runAfterBothAsync(taskB,()->{
            logger.info("任务C开始执行");
        });

 /**
     * 两个任务组合
     * @param args
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Integer> taskA = CompletableFuture.supplyAsync(() -> {
        Thread.currentThread().getId();
        logger.info("任务A开始执行");
        //代码逻辑
        int i = 10 / 2;
        System.out.println("运行结果:" + i);
        return i;
        //thenAcceptAsync 任务A执行完执行任务B 即可以获取到上一步任务A的执行结果且有返回值
        },executor);
        CompletableFuture<String> taskB = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            logger.info("任务B开始执行");
            return "Hello";
        },executor);
        //组合任务A任务B完成后  任务A任务B组合执行完成后后执行任务C thenAcceptBothAsync 
       // 且可以获取到组合任务A任务B的执行结果 但是无返回值
        taskA.thenAcceptBothAsync(taskB,(taskAResult,taskBResult)->{
            logger.info("任务A的执行结果为{},任务B的执行结果为{}",taskAResult,taskBResult);
        },executor);
    }
    CompletableFuture<Integer> taskA = CompletableFuture.supplyAsync(() -> {
        Thread.currentThread().getId();
        logger.info("任务A开始执行");
        //代码逻辑
        int i = 10 / 2;
        System.out.println("运行结果:" + i);
        return i;
        //thenAcceptAsync 任务A执行完执行任务B 即可以获取到上一步任务A的执行结果且有返回值
        },executor);
        CompletableFuture<String> taskB = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            logger.info("任务B开始执行");
            return "Hello";
        },executor);
         //组合任务A任务B执行完成后执行任务C  thenAcceptBothAsync可以获取到自核任务A和任务B的返回值,
         //且可以返回值
        CompletableFuture<String> result = taskA.thenCombineAsync(taskB, (taskAResult, taskBResult) -> {
            logger.info("开始执行任务C");
            logger.info("任务A的执行结果为{},任务B的执行结果为{}", taskAResult, taskBResult);
            return "任务A" + taskAResult + "任务B" + taskBResult + "任务C" + "World";
        }, executor);
        logger.info("最终执行结果为{}",result.get());
    }
 /**
     * 两个任务组合
     * @param args
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Object> taskA = CompletableFuture.supplyAsync(() -> {
        Thread.currentThread().getId();
        logger.info("任务A开始执行");
        //代码逻辑
        int i = 10 / 2;
        System.out.println("运行结果:" + i);
        return i;
        //thenAcceptAsync 任务A执行完成执行任务B 即可以获取到上一步任务A的执行结果且有返回值
        },executor);
        CompletableFuture<String> taskB = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            logger.info("任务B开始执行");
            return "Hello";
        },executor);
        //组合结果任务A任务B 只要有一个执行完成就执行任务C,但是获取不到组合结果的返回结果,且无返回值
        taskA.runAfterEitherAsync(taskB,()->{
            logger.info("任务C开始执行");
        },executor);
        //组合结果任务A任务B 只要有一个执行完成就执行任务C,可以获取到其中一个的返回结果,且无返回值
        taskA.acceptEitherAsync(taskB,(res)->{
            logger.info("任务A或者任务B的结果为{}",res);
            logger.info("任务C开始执行");
        },executor);
        //组合结果任务A任务B 只要有一个执行完成就执行任务C,可以获取到其中一个的返回结果,且有返回结果
        taskA.applyToEitherAsync(taskB,res->{
            logger.info("任务A或者任务B的结果为{}",res);
            logger.info("任务C开始执行");
            return res+"任务C结果为"+"World";
        },executor);
    }
  /**
     * 任务全部完成后返回
     * @param args
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Object> taskA = CompletableFuture.supplyAsync(() -> {
        Thread.currentThread().getId();
        logger.info("任务A开始执行");
        //代码逻辑
        int i = 10 / 2;
        System.out.println("运行结果:" + i);
        return i;
        //thenAcceptAsync 任务A执行完成执行任务B 即可以获取到上一步任务A的执行结果且有返回值
        },executor);
        CompletableFuture<String> taskB = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            logger.info("任务B开始执行");
            return "Hello";
        },executor);
        CompletableFuture<String> taskC = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            logger.info("任务C开始执行");
            return "World";
        },executor);

        CompletableFuture<Void> voidCompletableFuture = CompletableFuture.allOf(taskA, taskB, taskC);
        ////阻塞  三个任务全部执行完成后返回结果
        voidCompletableFuture.get();
        logger.info("最终结果为{}",voidCompletableFuture.get());
    }
 /**
     * 任务全部完成后执行其他逻辑
     * @param args
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Object> taskA = CompletableFuture.supplyAsync(() -> {
        Thread.currentThread().getId();
        logger.info("任务A开始执行");
        //代码逻辑
        int i = 10 / 2;
        System.out.println("运行结果:" + i);
        return i;
        //thenAcceptAsync 任务A执行完成执行任务B 即可以获取到上一步任务A的执行结果且有返回值
        },executor);
        CompletableFuture<String> taskB = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            logger.info("任务B开始执行");
            return "Hello";
        },executor);
        CompletableFuture<String> taskC = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            logger.info("任务C开始执行");
            return "World";
        },executor);

        CompletableFuture<Void> voidCompletableFuture = CompletableFuture.allOf(taskA, taskB, taskC);
        ////阻塞  等待所有任务全部完成
        voidCompletableFuture.get();
    }
  /**
     * 只要有一个任务完成则返回结果
     * @param args
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Object> taskA = CompletableFuture.supplyAsync(() -> {
        Thread.currentThread().getId();
        logger.info("任务A开始执行");
        //代码逻辑
        int i = 10 / 2;
        System.out.println("运行结果:" + i);
        return i;
        //thenAcceptAsync 任务A执行完成执行任务B 即可以获取到上一步任务A的执行结果且有返回值
        },executor);
        CompletableFuture<String> taskB = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            logger.info("任务B开始执行");
            return "Hello";
        },executor);
        CompletableFuture<String> taskC = CompletableFuture.supplyAsync(() -> {
            Thread.currentThread().getId();
            logger.info("任务C开始执行");
            return "World";
        },executor);

        CompletableFuture<Object> objectCompletableFuture = CompletableFuture.anyOf(taskA, taskB, taskC);
       //只要有一个成功则返回
        objectCompletableFuture.get();
        logger.info("结果为{}", objectCompletableFuture.get());
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值