IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JUC-CompletableFuture -> 正文阅读

[Java知识库]JUC-CompletableFuture

get()和join()都能获取返回结果,也都会阻塞FutureTask?

    public static void main(String[] args) throws Exception {
        FutureTask<Integer> futureTask = new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName() + " come in");
            try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }
            return 1024;
        });
        new Thread(futureTask).start();
       /* System.out.println(futureTask.get()); // get()会阻塞直到线程完成才会继续执行
        System.out.println(futureTask.get(2L, TimeUnit.SECONDS)); // 带过期时间的阻塞*/
        //不要阻塞,尽量用轮询替代
        while(true){
            if(futureTask.isDone()){
                System.out.println("----result: "+futureTask.get());
                break;
            }else{
                System.out.println("还在计算中,别催,越催越慢,再催熄火");
            }
        }
    }

get()阻塞,一旦调用get(),不管计算是否完成都会导致阻塞

isDone()轮询,轮询的方式会小号额外的CPU资源,如果想要异步获取结果,通常都会以轮询的方式去获取结果,尽量不要阻塞

如何避免阻塞了?引入了CompletableFuture

?CompletionStage:代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另一个阶段

  • 一个阶段的计算执行可以是Function,Consumer或者Runnable
  • 一个阶段的执行可能是被单个阶段的完成触发,也可能是由多个阶段一起触发

CompletableFuture:在Java8中CompletableFuture提供了非常强大的future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合CompletableFuture的方法。

  • 它可能代表一个明确完成的future,也可能代表一个完成阶段(CompletionStage)。它支持在计算完成以后触发一些函数或执行某些动作。
  • 它实现了future和CompletionStage的接口。

它有四个核心的静态方法来创建一个异步操作

无返回值

public static CompletableFuture<Void> runAsync(Runnable runnable);

public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor);

有返回值

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier);

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)

  • 不指定Executor,使用默认的ForkJoinPool.commonPool()作为它的线程池执行异步代码,它的缺点是用户线程结束后默认的线程池会销毁,则异步线程的代码就不会执行
  • 强烈建议?CompletableFuture配合Excutor使用
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 20, 1, TimeUnit.MINUTES,
                new LinkedBlockingQueue<>(50), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
        CompletableFuture<Integer> exceptionally = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + " come in");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 2;
        }, executor).whenComplete((v, e) -> {
            if (e == null) {
                System.out.println("result = " + v);
            }
        }).exceptionally(e -> {
            e.printStackTrace();
            return null;
        });
        // get()和join()都能获取返回结果,也都会阻塞
        // exceptionally.get(); // 会抛出异常ExecutionException, InterruptedException
        // exceptionally.join(); // 和不会抛出异常,推荐使用join()获取结果
        // CompletableFuture要使用自定义创建的线程池,如果使用默认的线程池,则主线程结束后默认的线程池就会销毁,异步线程的代码就不会执行
        executor.shutdown();
        System.out.println("main thread over");
    }

  • ?get()和join()都能获取返回结果,也都会阻塞
  • get()会抛出异常ExecutionException, InterruptedException,join()不会抛出异常,推荐使用join()获取结果
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:24:23  更:2021-09-24 10:26:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:49:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码