异步编程CompletableFuture总结

在这里插入图片描述

文章目录

    • 1. 简介:
    • 2. 比较
      • 1、传统方式
      • 2、使用CompletableFuture:
        • 异步执行
        • 返回值
    • 3、组合处理:
        • anyOf
        • allof :
    • 4. 异步回调:
        • thenAccept
        • thenApply
        • whenComplete等同于 thenAccept
        • handel()等同于thenApply
    • 5. 常用方法:
      • 1、supplyAsync
      • 2、runAsync
      • 3、then*
      • 4、then*Async
      • 5、thenApply
      • 6、thenAccept
      • 7、thenRun
      • 8、thenCompose
      • 9、thenCombine
      • 10、runAfterEither
      • 11、runAfterBoth
      • 12、get()
      • 13、V get(long timeout, TimeUnit unit)
      • 14、T getNow(T valueIfAbsent)
      • 15、whenComplete
      • 16、exceptionally
      • 17、complete
      • 18、cancel
      • 19、allOf
      • 20、anyOf

1. 简介:

CompletableFuture,它其实是JDK8提供出来的,它是一种基于future异步编程的实现:1、以前我们执行一个异步任务,想要获得这个任务的返回值的时候,就得通过这个future加callable,这种传统方式,来进行实现,当我们要获得返回值的时候,就去调用这个future task 的get方法,当我们去调用get方法呢,会阻塞,所以像以前这种传统的异步编程,并且要获的返回结果进行处理,这种方式实现起来非常的麻烦,并且要获的返回值,会阻塞后面的代码。2、而当CompletableFuture来进行异步任务的话,并且我们要拿到这个返回值,进行处理,也可以异步的方式,而不会阻塞后面的代码3CompletableFuture:提供了组合处理:比如我们有多个异步任务,那么这多个异步任务中,我想拿到里面最快的这一个,在我们以前传统的异步编程当中,实现起来非常麻烦,但是通过			CompletableFuture是非常的简单的,如果说我们想在这多个异步任务当中,全部执行完成之后,想去执行一些其他的,在之前实现也非常麻烦,此时就可以通过CompletableFuture来实现是非常的简单的,4.还支持异步回调,我们想在一个异步任务执行完成之后,去执行另一个异步任务,在以前我们必须对第一个任务进行“JOIN"等待,等第一个任务完成了之后,再去执行第二任务,或者把第二个任务,嵌套在第一个任务内,当第一个任务执行完成之后再去执行第二个任务,但是这种嵌套方式会出现我们所谓的”回调地狱“,也就是说如果你的异步任务非常的多,并且都希望按照顺序一个一个去执行的话,你需要每一个嵌套在上一个当中,这样代码的可阅读性,维护性都是非常差,那我们通过CompletableFuture,它所提供的这种异步回调,实现起来是非常简洁的

2. 比较

1、传统方式

package org.example;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;/*** @ClassName CompletableFutureTest* @Author JS* @Date 2024-05-15 23:30* @Version 1.0**/
public class CompletableFutureTest {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(2000);return "futureTask1执行完成";}});new Thread(futureTask).start();//get() 方法的作用是,以阻塞的方式,获取任务执行结果System.out.println(futureTask.get());System.out.println("TODO....");}
}

在这里插入图片描述

2、使用CompletableFuture:

异步执行
  • runAsync()方法执行任务是没有返回值
  • supplyAsync() 方法执行任务则支持返回值
package org.example;import java.util.concurrent.CompletableFuture;/*** @ClassName CompletableFutureDemo* @Author lenovo* @Date 2024-05-15 23:45* @Version 1.0**/
public class CompletableFutureDemo {public static void main(String[] args) {CompletableFuture future1 = CompletableFuture.runAsync(() -> {System.out.println("执行没有返回值的任务");});CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {return "执行有返回的任务";});System.out.println(future2.join());}
}
返回值
  • get()方法抛出 (InterruptedException、ExecutionException) 检查时异常,程序必须处理
  • join() 方法只抛出运行时异常,程序可不做处理

在这里插入图片描述

3、组合处理:

  • anyOf 返回跑的最快的那个future。最快的如果异常都玩完
  • allof 全部并行执行,执行完之后再去执行我们所需要的业务逻辑,如果需要获得返回值,需要配合thenApply,异常会抛出不影响其他任务
anyOf
package org.example;import java.util.concurrent.CompletableFuture;/*** @ClassName CompletableFutureDemo2* @Author lenovo* @Date 2024-05-15 23:52* @Version 1.0**/
public class CompletableFutureDemo2 {public static void main(String[] args) {CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "朋友小王去你家送药");CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "朋友小去你家送药");CompletableFuture<Object> anyFutures = CompletableFuture.anyOf(future1, future2);System.out.println(anyFutures.join());}
}

在这里插入图片描述

  • 其实这种就可以运用在我们异步任务当中,有多个备选方案,比如我们请求第三方接口,那么这第三方接口呢,他提供l多个线路,那这几个线路在某个时间段之内不确定谁更快,那么我们就可以将这几个线路,都通过 CompletableFuture 来进行异步请求,然后再通过anyOf 拿到请求最快的那一个
allof :
package org.example;import java.util.concurrent.CompletableFuture;/*** @ClassName CompletableFutureDemo3* @Author lenovo* @Date 2024-05-15 23:52* @Version 1.0**/
public class CompletableFutureDemo3 {public static void main(String[] args) {CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "朋友小王去你家送药 ");CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> " 朋友小去你家送药");CompletableFuture<Object> anyFutures = CompletableFuture.allof(future1, future2).thenApply(res->{return future1.join()+future2.join();//todo...执行我们所需要的业务逻辑代码});System.out.println(anyFutures.join());}
}

在这里插入图片描述

  • 如果你想在多个异步任务执行完成之后,来去执行一些业务逻辑的话,那么就可以通过allof,同样的传入多个future,allof的参数是一个可变长度的数组,然后再结合 thenApply 这个方法来进行处理,那在这个方法体当中,我们就可以将 future1 和 future2 进行 join,等待他们处理完成之后,我们就可在后面,执行我们所需要的业务逻辑代码,这种逻辑功能比较适用于多个任务,都需要并行的去执行,但是呢要拿到他们每个任务的结果,比方说我们在注册 验证的时候,首先判断,它的用户名是否被注册、手机号码是否被注册、手机验证码是否正确,如果这几项都没有问题的话,我们再去执行注册相关的业务代码。注意 allof出现异常,不影响其他任务,所以说可以针对每一个future,进行try-catch 捕捉他们的异常,如果非核心的future 他出现了异常,我们也可以考虑继续执行我们的核心业务

4. 异步回调:

  • whenComplete() 没有返回值,且返回的 CompletableFuture 为任务结果,而非回调结果

  • handle() 有返回值,且返回的CompletableFuture 为回调结果

他们两个出现异常不会中断 ,throwable 参数会接受前面的任务的异常,异常会通过get抛出到主线程

  • 链式处理

    • thenRun(Runnable runnable): 对异步任务的结果进行操作,不能传入参,也没有返回值

    • thenAccept(Consumer consumer):可传入参数

    • thenApply(Function function):可传入参数,并返回结果

他们三个出现异常后面的任务会中断,处理任务中感知不到异常,异常会通过get抛出到主线程

thenAccept
package org.example;import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;/*** @ClassName CompletableFutureTest2* @Author lenovo* @Date 2024-05-16 0:25* @Version 1.0**/
public class CompletableFutureTest2 {public static void main(String[] args) throws ExecutionException, InterruptedException {CompletableFuture future2 = CompletableFuture.supplyAsync(() -> 5).thenAccept(result -> {System.out.println("任务执行结果 =" + result * 3);}).thenAccept(result -> {System.out.println("任务执行完成");});}}

在这里插入图片描述

thenApply
package org.example;import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;/*** @ClassName CompletableFutureTest2* @Author lenovo* @Date 2024-05-16 0:35* @Version 1.0**/
public class CompletableFutureTest3 {public static void main(String[] args) throws ExecutionException, InterruptedException {CompletableFuture future3 = CompletableFuture.supplyAsync(() -> 5).thenApply(result -> result * 3).thenApply(result -> result + 3);System.out.println("future3:"+future3.join());}}

在这里插入图片描述

whenComplete等同于 thenAccept
package org.example;import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;/*** @ClassName CompletableFutureTest2* @Author lenovo* @Date 2024-05-16 0:25* @Version 1.0**/
public class CompletableFutureTest4 {public static void main(String[] args) {CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {System.out.println(111);return 444;});CompletableFuture<Integer> future1Callback = future1.whenComplete((result, throwable)->{System.out.println(222);}).whenComplete((result,throwable) -> {System.out.println(333);});System.out.println(future1Callback.join());}}

在这里插入图片描述

handel()等同于thenApply
package org.example;import java.util.concurrent.CompletableFuture;/*** @ClassName CompletableFutureTest2* @Author lenovo* @Date 2024-05-16 0:44* @Version 1.0**/
public class CompletableFutureTest5 {public static void main(String[] args) {CompletableFuture<String> future2 = CompletableFuture.supplyAsync(()-> {return"返回任务结果";});CompletableFuture<String> future2Callback = future2.handle((result, throwable) ->{return"返回任务结果";});System.out.println(future2Callback.join());}}

在这里插入图片描述

5. 常用方法:

1、supplyAsync

  • 异步执行任务,任务有返回值
package com.Js;import java.util.concurrent.*;
import java.util.function.Function;
import java.util.function.Supplier;public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(10);CompletableFuture<String> task = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());return "Hello";}, executorService);}private static void sleep(int i) {try {TimeUnit.SECONDS.sleep(i);} catch (InterruptedException e) {System.out.println(e);e.printStackTrace();}}
}

2、runAsync

  • 异步执行任务,任务没有返回值
package com.Js;import java.util.concurrent.*;public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(10);CompletableFuture<Void> task = CompletableFuture.runAsync(() -> {System.out.println(Thread.currentThread().getName());}, executorService);}private static void sleep(int i) {try {TimeUnit.SECONDS.sleep(i);} catch (InterruptedException e) {System.out.println(e);e.printStackTrace();}}
}

3、then*

  • 功能:前一个异步任务执行完,然后执行本任务

  • 当前执行thenApply()方法的线程来负责执行本任务,比如main线程,但是如果前一个异步任务还没执行完,那么main线程就不能执行本任务了,得等前一个任务执行完后才能执行本任务,这个时候就会在执行前一个任务的线程上执行本任务,这样才能保证执行顺序

package com.Js;import java.util.concurrent.*;
import java.util.function.Function;
import java.util.function.Supplier;public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(10);Supplier<String> taskA = () -> {System.out.println("1:" + Thread.currentThread().getName());return "Hello";};Function<String, String> taskB = s -> {System.out.println("2:" + Thread.currentThread().getName());return s + " World";};CompletableFuture<String> future1 = CompletableFuture.supplyAsync(taskA, executorService);sleep(1);future1.thenApply(taskB);System.out.println("haha");// ...}private static void sleep(int i) {try {TimeUnit.SECONDS.sleep(i);} catch (InterruptedException e) {e.printStackTrace();}}
}

4、then*Async

  • 会利用CompletableFuture中公共的ForkJoinPool来执行任务

5、thenApply

  • 任务类型:Function<? super T,? extends U> fn
  • 有入参,有返回值

6、thenAccept

  • 任务类型:Consumer<? super T> action
  • 有入参,无返回值

7、thenRun

  • 任务类型:Runnable action

  • 无入参,无返回值

8、thenCompose

  • 任务类型:Function<? super T, ? extends CompletionStage> fn
  • 有入参,有返回值,返回值类型只能是CompletionStage
ExecutorService executorService = Executors.newFixedThreadPool(10);CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());return "Hello";}, executorService).thenCompose(s -> CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());return s + " World";})).thenCompose(s -> CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());return s + " !!!";}));System.out.println(future.get());
  • 按顺序执行两个并行任务

9、thenCombine

  • 任务类型:CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn

  • 有两个入参

    • 第一个参数为CompletionStage

      • 第二个参数为具体要执行的任务,认为类型为BiFunction,有两个入参,一个返回值

        • ExecutorService executorService = Executors.newFixedThreadPool(10);CompletableFuture<String> futureA = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());sleep(3);return "Hello";}, executorService);CompletableFuture<String> futureB = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());sleep(3);return " World";}, executorService);CompletableFuture<String> result = futureA.thenCombine(futureB, (resultA, resultB) -> {System.out.println(Thread.currentThread().getName());return resultA + resultB;});System.out.println(result.get());
    • 整合两个并行执行的任务结果

10、runAfterEither

  • 两个任务中任意一个完成了,就执行回调

    • package com.Js;import java.util.concurrent.*;
      import java.util.function.Function;
      import java.util.function.Supplier;public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(10);CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());sleep(5);return "Hello";}, executorService);CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());sleep(5);return "World";}, executorService);task2.runAfterEither(task1, () -> System.out.println("!!!"));}private static void sleep(int i) {try {TimeUnit.SECONDS.sleep(i);} catch (InterruptedException e) {e.printStackTrace();}}
      }
      

11、runAfterBoth

  • 两个任务都完成了,才执行回调

    package com.Js;import java.util.concurrent.*;
    import java.util.function.Function;
    import java.util.function.Supplier;public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(10);CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());sleep(5);return "Hello";}, executorService);CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());
    //            sleep(5);return "World";}, executorService);task2.runAfterBoth(task1, () -> System.out.println("!!!"));}private static void sleep(int i) {try {TimeUnit.SECONDS.sleep(i);} catch (InterruptedException e) {e.printStackTrace();}}
    }
    

12、get()

  • 阻塞等待结果

13、V get(long timeout, TimeUnit unit)

  • 超时等待结果

14、T getNow(T valueIfAbsent)

  • 立即获取结果,如果任务还没完成,则返回valueIfAbsent

15、whenComplete

  • 入参为BiConsumer<? super T, ? super Throwable> action
    • 任务正常结束第一个参数传入的是结果
    • 任务异常结束第二个参数传入的是异常
      • 异常类型是CompletionException
  • 没有返回值

16、exceptionally

  • 入参为Function<Throwable, ? extends T> fn
    • 入参为异常
      • 异常类型是CompletionException
  • 可以返回其他值
  • 如果任务没有出现异常则不会执行

17、complete

  • 直接让任务完成
package com.Js;import java.util.concurrent.*;
import java.util.function.Function;
import java.util.function.Supplier;public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(10);CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());sleep(5);return "Hello";}, executorService);task1.complete("haha");System.out.println(task1.get());executorService.shutdown();}private static void sleep(int i) {try {TimeUnit.SECONDS.sleep(i);} catch (InterruptedException e) {e.printStackTrace();}}
}

18、cancel

  • 如果任务还没开始,或正在执行,则能取消,设置取消标记为true

    • package com.Js;import java.util.concurrent.*;
      import java.util.function.Function;
      import java.util.function.Supplier;public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(10);CompletableFuture<String> task = CompletableFuture.supplyAsync(() -> {sleep(3);System.out.println(Thread.currentThread().getName());return "Hello";}, executorService);sleep(1);task.cancel(false);System.out.println(task.get());}private static void sleep(int i) {try {TimeUnit.SECONDS.sleep(i);} catch (InterruptedException e) {System.out.println(e);e.printStackTrace();}}
      }
      
  • 如果任务已经完成,则设置取消标记为false

19、allOf

  • 所有任务都执行完后才执行下一个任务

    package com.Js;import java.util.concurrent.*;
    import java.util.function.Function;
    import java.util.function.Supplier;public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(10);CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());sleep(5);return "Hello";}, executorService);CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());return "World";}, executorService);CompletableFuture.allOf(task1, task2).join();System.out.println("!!!");}private static void sleep(int i) {try {TimeUnit.SECONDS.sleep(i);} catch (InterruptedException e) {e.printStackTrace();}}
    }
    

20、anyOf

  • 任意一个任务执行完就可以执行下一个任务了

    package com.Js;import java.util.concurrent.*;
    import java.util.function.Function;
    import java.util.function.Supplier;public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(10);CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());sleep(5);return "Hello";}, executorService);CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());return "World";}, executorService);CompletableFuture.anyOf(task1, task2).join();System.out.println("!!!");}private static void sleep(int i) {try {TimeUnit.SECONDS.sleep(i);} catch (InterruptedException e) {e.printStackTrace();}}
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python——IO编程

IO在计算机中指Input/Output&#xff0c;也就是输入和输出。由于程序和运行时数据是在内存中驻留&#xff0c;由CPU这个超快的计算核心来执行&#xff0c;涉及到数据交换的地方&#xff0c;通常是磁盘、网络等&#xff0c;就需要IO接口。 比如你打开浏览器&#xff0c;访问新浪…

Linux查看进程命令ps和top

Linux 是一种自由和开放源代码的操作系统&#xff0c;它的使用在全球范围内非常广泛。在 Linux 中&#xff0c;进程是操作系统中最重要的组成部分之一&#xff0c;它代表了正在运行的程序。了解如何查看正在运行的进程是非常重要的&#xff0c;因为它可以帮助你了解系统的运行状…

Python 白底黑字图片去除红色水印

Python 白底黑字图片去除红色水印 import os from PIL import Imagedef remove_color(image_path, new_image_path):"""初始化:param image_path: 图片路径:param new_image_path: 新图片路径"""# 打开图片并转换为RGBA格式img Image.open(imag…

java入门1.1.2

前言&#xff1a; 第一&#xff1a;一坨垃圾的迭代&#xff0c;还是垃圾 第二&#xff1a;本内容为对类&#xff0c;对象&#xff0c;构造函数的最新抽象理解 正片 先将类&#xff0c;对象&#xff0c;还要构造函数翻译成英文 class&#xff0c;object&#xff0c;construc…

汇中 SCL-61D2超声水表汇中通讯协议

RS-485串行通讯接口设置表 通用代码注释 读取正向仪表数据 DD的内容为 通讯示例 主机命令&#xff1a;2A 41 4A 仪表响应&#xff1a;26 41 4A 00 00 13 63 00 00 07 72 00 00 10 34 00 33 读取负向仪表数据&#xff1a;&#xff08;单向型仪表无此命令&#xff09; DD的内容…

selenium发展史

Selenium Core 2004 年&#xff0c;Thoughtworks 的工程师 Jason Huggins 正在负责一个 Web 应用的测试工作&#xff0c;由于这个项目需要频繁回归&#xff0c;这导致他不得不每天做着重复且低效的工作。为了解决这个困境&#xff0c;Jason 开发了一个运行在 JavaScript 沙箱中…

2010-2024年各地级市社会信用体系建设匹配DID数据

2010-2024年各地级市社会信用体系建设匹配DID数据 1、时间&#xff1a;2010-2024年 2、指标&#xff1a;行政区划代码、年份、所属省份、地区、社会信用体系建设示范区 3、范围&#xff1a;310个地级市 4、来源&#xff1a;国家发改委 5、指标解释&#xff1a; 社会信用体…

跨平台应用开发进阶(五十四)cordova自定义插件

文章目录 一、前言二、cordova 自定义插件2.1 cordova 安装2.2 cordova 创建 android 工程2.3 使用 cordova 官方提供的插件2.4 创建自定义插件 三、拓展阅读 一、前言 在前期博文《ReactNative进阶&#xff08;一&#xff09;&#xff1a;ReactNative 学习资料汇总》中&#…

C++基础与函数解析 | 函数的声明与定义 | 函数调用 | 函数详解 | 函数重载 | 重载解析 | 递归函数 | 内联函数 | 函数指针

文章目录 一、函数基础1.基本函数定义2.函数的声明与定义3.函数调用 二、函数详解1.参数2.函数体3.返回类型 三、函数重载与重载解析1.函数重载2.重载解析 四、函数相关的其他内容1.递归函数2.内联函数3.constexpr函数&#xff08;C11起&#xff09;4.consteval 函数 (C20 起 )…

Redis - hiredis源码安装和接口使用介绍

一、hiredis源码安装说明 本文创作基于 hiredisv1.2.0版本 1.简介 hiredis是一个用于与Redis交互的C语言客户端库。它提供了一组简单易用的API&#xff0c;使开发人员可以轻松地连接到Redis服务器&#xff0c;并执行各种操作&#xff0c;如设置和获取键值对、执行命令、订阅和…

C语言 | Leetcode C语言题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; struct ListNode *reverseBetween(struct ListNode *head, int left, int right) {// 因为头节点有可能发生变化&#xff0c;使用虚拟头节点可以避免复杂的分类讨论struct ListNode *dummyNode malloc(sizeof(struct ListNode));dummyNode…

案例实践 | 招商局集团基于长安链的双循环航运贸易应用

案例名称-招商局双循环航运贸易联盟链 ■ 建设单位 招商局集团 ■ 用户群体 货主企业、物流企业、基础设施运营商等各参与主体 ■ 应用成效 已赋能产业链上下游超1.2万家中小微企业&#xff0c;累计提供普惠金融超830亿元 案例背景 作为全球贸易大国&#xff0c;我国约…

风电功率预测 | 基于CNN卷积神经网络的风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于卷积神经网络(Convolutional Neural Network, CNN)的风电功率预测可以通过以下步骤实现: 数据准备:收集与风电场发电功率相关的数据,包括风速、风向、温度、湿度等气象数据以及风电场的历史功率数据。 数据预处理:对…

Cadence 16.6 绘制PCB封装时总是卡死的解决方法

Cadence 16.6 绘制PCB封装时总是卡死的解决方法 在用Cadence 16.6 PCB Editor绘制PCB封装时候&#xff0c;绘制一步卡死一步&#xff0c;不知道怎么回事儿&#xff0c;在咨询公司IT后&#xff0c;发现是WIN系统自带输入法的某些热键与PCB Editor有冲突&#xff0c;导致卡死。 …

系统思考—团队学习

结束昨日435期JSTO“探索学习的新视界&#xff1a;硬核工具分享”&#xff0c;有伙伴分享的提升效率的AI工具&#xff0c;也有自我发现团队问题解决的工具&#xff0c;伙伴们都在各自的领域实践、吸收、反馈、复盘。这次的团队学习不仅是知识的传递&#xff0c;更是一场脑力激荡…

线性系统(二)

线性系统&#xff08;二&#xff09; 1.直观理解线性方程组结构2. 不同解的结论3. 更一般的高斯-约旦消元法4.齐次线性方程组 链接: 线性系统&#xff08;一&#xff09; 1.直观理解线性方程组结构 长这样&#xff0c;方程就有解&#xff0c;即相交坐标。 长这样&#xff0c;…

[论文笔记]Corrective Retrieval Augmented Generation

引言 今天带来论文Corrective Retrieval Augmented Generation的笔记&#xff0c;这是一篇优化RAG的工作。 大型语言模型(LLMs) inevitable(不可避免)会出现幻觉&#xff0c;因为生成的文本的准确性不能仅仅由其参数化知识来确保。尽管检索增强生成(RAG)是LLMs的一个可行补充…

Kibana使用

一、什么是Kibana   Kibana 是一个开源的分析和可视化平台&#xff0c;Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析&#xff0c;并在各种图表、表格和地图中可视化数据。 Kibana使用&#xff1a…

Jenkins 忘记登录密码怎么办

在安装Jenkins中遇到忘记登录密码该怎么呢&#xff1f;下面是一个解决办法 1. 先停止jenkins服务 我是用tomcat启动的jenkis 2. 找到config.yaml文件 find / -name config.xml命令执行后找到如下结果&#xff1a; /root/.jenkins/config.xml /root/.jenkins/users/admin_839…

scanf读取标准输入

内容 scanf函数的原理 多种数据类型混合输入 常用的数据输入/输出函数 程序员可以给程序输入数据&#xff0c;程序处理后会返回一个输出。C语言通过函数库读取标准输入&#xff0c;然后通过对应函数处理将结果打印到屏幕上&#xff0c;printf函数可以将结果打印到屏幕上。下…