Java异步编程实践
作者:用释怀来成全悲伤_490_905_560 | 来源:互联网 | 2024-12-20 18:02
本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。
### 一、使用线程实现异步任务
在Java中,最基本的异步任务实现方式是通过创建新线程来执行耗时操作。下面是一个简单的例子:
```java
@Test
public void testThread() throws Exception {
System.out.println("主线程开始执行");
Thread thread = new Thread(() -> {
System.out.println("===任务开始===");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("===任务完成===");
});
thread.start();
System.out.println("主线程结束执行");
}
```
### 二、Future接口的应用
Future接口用于表示异步计算的结果。它提供了一种检查计算是否完成的方法,并能够获取计算结果或取消计算。然而,Future接口存在一些局限性,例如获取结果时会阻塞主线程。
```java
@Test
public void testFuture() throws Exception {
System.out.println("主线程开始执行");
ExecutorService executor = Executors.newFixedThreadPool(1);
Future future = executor.submit(() -> {
System.out.println("===任务开始===");
Thread.sleep(5000);
System.out.println("===任务完成===");
return 3;
});
// 获取结果时会阻塞主线程
// Integer result = future.get();
System.out.println("主线程结束执行");
executor.shutdown();
}
```
### 三、CompletableFuture类的使用
CompletableFuture类提供了更强大的异步编程能力,支持链式调用和组合多个异步任务。它结合了Future接口的功能,并增加了许多新的特性。
```java
@Test
public void testCompletableFuture() throws Exception {
System.out.println("主线程开始执行");
ExecutorService executor = Executors.newFixedThreadPool(2);
CompletableFuture future = CompletableFuture.supplyAsync(() -> {
System.out.println("===任务开始===");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("===任务完成===");
return 3;
}, executor);
future.thenAccept(System.out::println);
System.out.println("主线程结束执行");
}
```
### 四、Spring框架中的@Async注解
Spring框架提供了@Async注解来简化异步方法的定义。要使用该注解,首先需要在配置类中启用异步支持。
#### XML配置方式
```xml
pool-size="2"
queue-capacity="100"
keep-alive="120"
rejection-policy="CALLER_RUNS" />
```
#### Java配置方式
```java
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(1000);
executor.setKeepAliveSeconds(300);
executor.setThreadNamePrefix("async-thread-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}
```
#### 使用@Async注解
```java
@Service
public class MyService {
@Async
public void executeLongTask() {
System.out.println("正在执行一项耗时任务");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务完成");
}
}
@Test
public void testAsync() throws Exception {
System.out.println("主线程开始执行");
myService.executeLongTask();
System.out.println("主线程结束执行");
}
```
#### 返回值处理
如果异步方法需要返回值,可以使用`AsyncResult`包装返回值。
```java
@Test
public void testAsyncResult() throws Exception {
System.out.println("主线程开始执行");
Future future = myService.executeLongTaskWithResult();
System.out.println("主线程结束执行");
System.out.println("异步执行结果:" + future.get());
}
@Async
public Future executeLongTaskWithResult() {
System.out.println("正在执行一项耗时任务");
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务完成");
return new AsyncResult<>(3);
}
```
推荐阅读
-
本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ...
[详细]
蜡笔小新 2024-12-27 16:33:32
-
本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ...
[详细]
蜡笔小新 2024-12-28 09:42:41
-
-
nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ...
[详细]
蜡笔小新 2024-12-28 13:00:24
-
本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ...
[详细]
蜡笔小新 2024-12-28 12:07:46
-
在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ...
[详细]
蜡笔小新 2024-12-28 08:20:07
-
本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ...
[详细]
蜡笔小新 2024-12-27 20:40:29
-
探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ...
[详细]
蜡笔小新 2024-12-27 19:49:07
-
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
-
本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ...
[详细]
蜡笔小新 2024-12-27 19:31:05
-
2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ...
[详细]
蜡笔小新 2024-12-27 17:49:56
-
本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ...
[详细]
蜡笔小新 2024-12-27 17:31:41
-
本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ...
[详细]
蜡笔小新 2024-12-27 16:07:12
-
本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ...
[详细]
蜡笔小新 2024-12-27 16:01:25
-
本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ...
[详细]
蜡笔小新 2024-12-27 14:38:54
-
本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ...
[详细]
蜡笔小新 2024-12-27 13:34:19
-
用释怀来成全悲伤_490_905_560
这个家伙很懒,什么也没留下!