Asynchronous Programming in Java

2025年5月9日 | 阅读 4 分钟

Java 中的异步编程允许任务独立执行,而不会阻碍主线程,从而提高性能和响应能力。它通常用于管理并发操作、后台任务和 I/O 处理。

Java 中的异步技术

  • 回调和回调地狱:回调充当提醒,在任务完成后进行通知。但是,过多的回调会导致回调地狱,使代码复杂且难以管理。
  • Java 的 CompletableFuture:CompletableFuture 于 Java 8 推出,通过促进任务链式调用、防止回调地狱和提高代码可读性,增强了异步编程。
  • ExecutorService 用于异步任务:ExecutorService 管理一组工作线程,允许各种任务并发执行,就像一群厨师同时准备不同的菜肴一样。
  • Java 8 和异步编程:Java 8 通过 CompletableFuture 改进了 异步功能,提供了对任务执行、链接和有效合并多个任务的改进管理。

异步编程的方法

Java 提供了两种常用的异步任务处理方法

  1. 使用 CompletableFuture 的回调:使用 CompletableFuture 异步执行任务,同时通过链式调用和组合操作避免回调地狱。
  2. 使用 Future 和 ExecutorService 的异步编程:使用 Future 和 ExecutorService 在线程池中管理任务,并在任务完成后检索结果。

使用 CompletableFuture 的回调

在 Java 中,回调用于在异步任务完成后处理其结果。传统方法有时会导致回调地狱,其中嵌套的回调使代码难以管理。

算法

步骤 1:使用 CompletableFuture.supplyAsync() 启动异步任务,在另一个线程中执行一段代码。

步骤 2:在异步任务中,通过 Thread.sleep() 使线程暂停 200 毫秒来模拟延迟。

步骤 3:延迟后,返回一个字符串消息(“Greetings from CompletableFuture!”)。

步骤 4:使用 thenAccept() 方法在异步任务完成后处理并打印结果。

步骤 5:为了让异步任务在程序结束前完成,请使用 Thread.sleep() 将主线程暂停 300 毫秒。

实施

输出

 
Greetings from CompletableFuture!   

使用 Future 和 ExecutorService 的异步编程

在 Java 中,异步编程允许任务同时执行而不会阻碍主 线程。通过使用 ExecutorService,您可以处理并在不同的线程中执行任务。提交任务后,它会返回一个 Future 对象,使您能够在任务完成后获取任务结果。

算法

步骤 1:使用 Executors.newSingleThreadExecutor() 设置 ExecutorService 以处理线程执行。

步骤 2:使用 executorService.submit() 方法提交一个异步任务,并返回一个包含任务结果的 Future 对象。

步骤 3:在任务内部,通过调用 Thread.sleep(200) 来模拟延迟。

步骤 4:使用 taskResult.get() 获取任务的结果。此调用将阻塞直到任务完成。

步骤 5:任务完成后并打印结果后,调用 executorService.shutdown() 方法来清理并停止执行器。

实施

输出

 
Task Result: Greetings from Future!   

实际应用和用例

Web 开发和异步任务:在 Java Web 开发中,异步编程允许服务器同时处理多个请求。这就像一家餐厅一次性服务许多顾客,而不会让他们中的任何一个等太久。

异步 I/O 操作:在执行 I/O 任务(如读取或写入数据)时,异步编程允许系统在等待 I/O 进程完成时处理其他活动。这就像在等待洗衣机完成的同时读书,而不是无所事事地等待。