并发编程

本文深入探讨了Java并发编程中的CompletableFuture,从基础入门到高级用法,包括供应任务、连接任务、合并任务等多个场景。通过实例演示了如何使用CompletableFuture创建线程,如supplyAsync、thenCompose、thenCombine等方法,阐述了它们之间的区别和使用场景。最后,文章还讨论了异常处理和不同方法的选择,如runAsync与supplyAsync、thenRun与thenAccept、handle与whenComplete等。
摘要由CSDN通过智能技术生成

并发编程

CompletableFuture入门

复习FutureTask (Callable内容)

CompletableFuture与FutureTask都是Future接口的实现类

并发是程序上的逻辑概念,

并行是物理上的概念

并发和并行的区别:

例子一:

      假设一个有三个学生需要辅导作业,帮每个学生辅导完作业是一个任务
        顺序执行:老师甲先帮学生A辅导,辅导完之后再取给B辅导,最后再去给C辅导,效率低下 ,很久才完成三个任务
        并发:老师甲先给学生A去讲思路,A听懂了自己书写过程并且检查,而甲老师在这期间直接去给B讲思路,讲完思路再去给C讲思路,让B自己整理步骤。这样老师就没有空                         着,一直在做事情,很快就完成了三个任务。与顺序执行不同的是,顺序执行,老师讲完思路之后学生在写步骤,这在这期间,老师是完全空着的,没做事的,所以效率低下。
        并行:直接让三个老师甲、乙、丙三个老师“同时”给三个学生辅导作业,也完成的很快。
        理解:

解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群

普通解释:
并发:交替做不同事情的能力
并行:同时做不同事情的能力
专业术语:
并发:不同的代码块交替执行
并行:不同的代码块同时执行

原文链接:https://blog.csdn.net/qq_27825451/article/details/78850336

如果程序是采用多线程的技术编写的,那么运行在单核单线程的机器上就会并发执行,运行在多核/多线程的机器上就会并行执行。

线程创建

继承Thread类,实现Runnable接口,

第三, 实现Callable接口,FutureTask接收结果

FutureTask<String> task = new FutureTask(callable);

CompletableFuture创建线程

一个场景:小白来到餐厅点菜,厨师炒菜打饭,小白开吃

一个工具类

CompletableFuture.supplyAsync() 开启任务

public class SmallTool {
   

    public static void sleepMillis(long millis) {
   
        try {
   
            Thread.sleep(millis);
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }
    }

    public static void printTimeAndThread(String tag) {
   
        String result = new StringJoiner("\t|\t")
                .add(String.valueOf(System.currentTimeMillis()))
                .add(String.valueOf(Thread.currentThread().getId()))
                .add(Thread.currentThread().getName())
                .add(tag)
                .toString();
        System.out.println(result);
    }

}
public class _01_supplyAsync {
   
    public static void main(String[] args) {
   
        SmallTool.printTimeAndThread("小白进入了餐厅");
        SmallTool.printTimeAndThread("小白点了 番茄炒蛋 + 一碗米饭");

        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
   
            SmallTool.printTimeAndThread("厨师炒菜");
            SmallTool.sleepMillis(200);
            SmallTool.printTimeAndThread("厨师打饭");
            SmallTool.sleepMillis(100);
            return "番茄炒蛋 + 米饭 做好了";
        });

        SmallTool.printTimeAndThread("小白在打王者");
        SmallTool.printTimeAndThread(String.format("%s ,小白开吃", cf1.join()));
    }
}

join() 方法会等待任务执行结束,然后返回任务的结果。

结果:

1620331256949 | 1 | main | 小白进入了餐厅
1620331256949 | 1 | main | 小白点了 番茄炒蛋 + 一碗米饭
1620331257003 | 1 | main | 小白在打王者
1620331257004 | 12 | ForkJoinPool.commonPool-worker-1 | 厨师炒菜
1620331257204 | 12 | ForkJoinPool.commonPool-worker-1 | 厨师打饭
1620331257327 | 1 | main | 番茄炒蛋 + 米饭 做好了 ,小白开吃

改进第一个场景

餐厅有两个人,厨师炒菜,服务员打饭上菜

thenCompse() --连接任务

public class _02_thenCompose {
   
    public static void main(String[] args) {
   
        SmallTool.printTimeAndThread("小白进入了餐厅");
        SmallTool.printTimeAndThread("小白点了 番茄炒蛋 + 一碗米饭");

        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
   
            SmallTool.printTimeAndThread("厨师炒菜");
            SmallTool.sleepMillis(200);
            return "番茄炒蛋";
        }).thenCompose(dish -> CompletableFuture.supplyAsync(() -> {
   
            SmallTool.printTimeAndThread("服务员打饭");
            SmallTool.sleepMillis(100);
            return dish +"米饭";
        }));

        SmallTool.printTimeAndThread("小白在打王者");
        SmallTool.printTimeAndThread(String
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值