Java实现异步的几种方法

一、异步概念

Java是一门面向对象编程语言,对于一个对象或一个方法,如果它需要执行一个比较长的操作可能会阻塞程序,导致程序变慢,用户体验不好。这时我们就需要将这个操作放到另一个线程中去执行,让主程序继续执行下面的逻辑代码,这样就可以实现多线程异步执行。异步执行是一种对资源占用率比较低,提高程序运行效率的方式。

二、Future 异步

Future 是 Java 中并发包里的一个类,可以用来实现异步回调。Future 的特点是,执行 Future.get() 方法时,如果异步操作已经完成,就直接返回结果;如果异步操作没有完成,那么它会等待操作完成再返回结果。

import java.util.concurrent.*;

public class FutureDemo {
    public static void main(String[] args) throws Exception {
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        
        Future future = threadPool.submit(() -> {
            // 模拟异步操作
            Thread.sleep(1000);
            return 100;
        });
        
        Integer result = future.get();
        
        System.out.println(result);
        
        threadPool.shutdown();
    }
}

三、CompletableFuture 异步

CompletableFuture 是 Java 8 中新增的异步操作类,是对 Future 的增强,支持异步回调、回滚、组合等操作。它的异步任务可以自由地与其他任务组合执行。

import java.util.concurrent.CompletableFuture;

public class CompletableFutureDemo {
    public static void main(String[] args) throws Exception {
        CompletableFuture future = CompletableFuture.supplyAsync(() -> {
            // 模拟异步操作
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 100;
        });
        
        future.thenAccept((result) -> {
            System.out.println(result);
        });
        
        // 阻塞等待异步任务执行完成
        future.join();
    }
}

四、回调函数 Callback

回调函数是指我们预先定义一个方法,然后将这个方法传给异步任务执行,异步任务执行完成后再执行我们预先定义好的回调方法。

public class CallbackDemo {
    public static void main(String[] args) throws Exception {
        asyncMethod((result) -> {
            System.out.println(result);
        });
        
        System.out.println("Main Thread End...");
    }
    
    private static void asyncMethod(Callback callback) {
        new Thread(() -> {
            // 模拟异步操作
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            callback.onFinish(100);
        }).start();
    }
}

interface Callback {
    void onFinish(Integer result);
}

五、CompletableFuture 组合异步

CompletableFuture 可以与其他 CompletableFuture 对象进行组合异步操作,实现更加复杂的异步操作。

import java.util.concurrent.CompletableFuture;

public class CompletableFutureComposeDemo {
    public static void main(String[] args) throws Exception {
        CompletableFuture future1 = CompletableFuture.supplyAsync(() -> {
            // 模拟异步操作
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 100;
        });
        
        CompletableFuture future2 = CompletableFuture.supplyAsync(() -> {
            // 模拟异步操作
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Hello";
        });
        
        CompletableFuture future3 = future1.thenCompose((result) -> {
            return CompletableFuture.supplyAsync(() -> {
                return result + " World";
            });
        });
        
        CompletableFuture future4 = future2.thenCombine(future3, (result1, result2) -> {
            return result1 + " " + result2;
        });
        
        future4.thenAccept((result) -> {
            System.out.println(result);
        });
        
        future4.join();
    }
}

原创文章,作者:EUQGW,如若转载,请注明出处:https://www.506064.com/n/368108.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
EUQGWEUQGW
上一篇 2025-04-02 01:28
下一篇 2025-04-02 02:00

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论