首页 > 编程语言 >JUC并发编程 用CompletableFuture 创建异步任务

JUC并发编程 用CompletableFuture 创建异步任务

时间:2024-01-14 13:34:26浏览次数:31  
标签:JUC java 异步 util concurrent CompletableFuture import

1 CompletableFuture对Future的改进

1.1 CompletableFuture为什么会出现

  • get()方法在Future计算完成之前会一直处在阻塞状态下,阻塞的方式和异步编程的设计理念相违背。
  • isDene()方法容易耗费cpu资源(cpu空转),
  • 对于真正的异步处理我们希望是可以通过传入回调函数,在Future结束时自动调用该回调函数,这样,我们就不用等待结果

1.2 CompletableFuture和CompletionStage介绍

类架构说明:

1.2.1 接口CompletionStage

代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段。
一个阶段的执行可能是被单个阶段的完成触发,也可能是由多个阶段一起触发

1.2.2 类CompletableFuture

提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合CompletableFuture的方法
它可能代表一个明确完成的Future,也可能代表一个完成阶段(CompletionStage),它支持在计算完成以后触发一些函数或执行某些动作

1.3 核心的四个静态方法,来创建一个异步任务

四个静态构造方法

对于上述Executor参数说明:若没有指定,则使用默认的ForkJoinPoolcommonPool()作为它的线程池执行异步代码,如果指定线程池,则使用我们自定义的或者特别指定的线程池执行异步代码

package com.kwfruit.thread.step01;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

@Slf4j
public class CompletableFutureBuildDemo {
    
    @SneakyThrows
    public static void main(String[] args) {
        /**
         * 无返回值
         */
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(()->{
            log.debug(Thread.currentThread().getName());
            try {TimeUnit.SECONDS.sleep(1);}catch (InterruptedException e){e.printStackTrace();}
            System.out.println(Thread.currentThread().getName());
        },executorService);

        System.out.println(completableFuture1.get());
        
        /**
         * 有返回值
         */
                CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(()->{
                    log.debug(Thread.currentThread().getName());
                    try {TimeUnit.SECONDS.sleep(1);}catch (InterruptedException e){e.printStackTrace();}
                    System.out.println(Thread.currentThread().getName());
                    return "hello supplyAsync";
                });

                System.out.println(completableFuture.get());
        
        
    }
   
}

标签:JUC,java,异步,util,concurrent,CompletableFuture,import
From: https://www.cnblogs.com/mangoubiubiu/p/17963605

相关文章

  • JUC 异步编程利器 CompletableFuture 介绍
    1从FutureTask到CompletableFuture1.1FutureFuture接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消异步任务的执行、判断任务是否被取消、判断任务执行是否完毕等。举例:比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开......
  • 用这4招 优雅的实现Spring Boot 异步线程间数据传递
    你好,我是蜗牛!在实际开发中需要在父子线程之间传递一些数据,比如用户登录信息使用ThreadLocal存放保证线程隔离,代码如下:/***@author公众号:woniuxgg*@description用户上下文信息*/publicclassUserUtils{privatestaticfinalThreadLocal<String>userLocal=new......
  • vue 高德地图异步引用
    先建立一个文件,引入高德  gDMapLoader.jsconstak='4e9f15de14b05fd8f19e1d8fbe91f0a3'exportdefaultfunctionload(){returnnewPromise(function(resolve,reject){if(window.AMap){resolve(window.AMap)}else{varscript=doc......
  • SpringBoot中使用SpringEvent业务解耦神器实现监听发布事件同步异步执行任务
    场景SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135504554设计模式-观察者模式在Java中的使用示例-环境监测系统:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det......
  • 优雅处理并发:Java CompletableFuture最佳实践
    第1章:引言大家好,我是小黑,今天,小黑要和大家聊聊CompletableFuture,这个Java8引入的强大工具。在Java传统的Future模式里,咱们都知道,一旦开始了一个异步操作,就只能等它结束,无法知道执行情况,也不能手动完成或者取消。而CompletableFuture呢,就像它的名字一样,是可以"完全控制"的Futur......
  • SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662设计模式-单例模式-饿汉式单例模式、懒汉式单例模式、静态内部类在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/......
  • 使用CompletableFuture提升代码执行效率示例
    代码示例/***全国/区域数据统计:*1.新能源规模*2.电网容量*3.输配线路*4.变电站*5.工作场站**@paramareaarea*@paramuseruser*@returntheobject*@since3.0.0*/publicSt......
  • 记一次JSF异步调用引起的接口可用率降低
    前言本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程,主要介绍了排查思路和JSF异步调用的流程,希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本文分析的JSF源码是基于JSF1,7.5-HOTFIX-T6版本。起因问题背景1.广告投放系统是典型的I/O密集型(I/......
  • 使用C#编写异步爬虫程序:爬取美图录网站精美图片内容并下载到本地
    使用C#编写的爬虫程序,用于爬取美图录网站上的图片内容。使用了HttpClient和Json.Net库。usingSystem;usingSystem.Net.Http;usingSystem.Threading.Tasks;usingNewtonsoft.Json.Linq;http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;classProgram{......
  • 批量爬取百度图片(异步+网络请求解析)
     4、分析百度图片搜索返回结果的HTML代码,或找一图片网站,编写爬虫抓取图片并下载形成专题图片。#########分析#########  #使用网络工具查看百度图片的组成,我们可以发现他的分类中的模块是  #通过一个a标签包揽的,这就表明,我们可以设置两层循环(由于此时下载的东西会......