在 Java 里,“API 接口异步”通常有两种常见含义,下面分别说明,并给出最常用、最推荐的做法。
目标:请求进来后,后台用线程池异步处理,接口快速返回,不阻塞 Tomcat 线程。
Callable@RestController
public class AsyncController {
@GetMapping("/async")
public Callable<String> async() {
return () -> {
Thread.sleep(2000); // 模拟耗时
return "done";
};
}
}
✅ 特点:
CompletableFuture(更灵活)@RestController
public class AsyncController {
@GetMapping("/async2")
public CompletableFuture<String> async2() {
return CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "done";
});
}
}
✅ 适合:
@Async(业务层异步)@Service
public class AsyncService {
@Async
public void doWork() {
// 异步执行
}
}
@SpringBootApplication
@EnableAsync
public class Application {}
⚠ 注意:
@Async 方法必须通过 Spring Bean 调用场景:下单后,接口立即返回“已受理”,后台慢慢处理。
API → MQ → 消费服务
{
"taskId": "123",
"status": "PROCESSING"
}
@RequestMapping("/servlet-async")
public void async(HttpServletRequest req, HttpServletResponse resp) {
AsyncContext ctx = req.startAsync();
ctx.start(() -> {
// 异步处理
ctx.complete();
});
}
⚠ 复杂度高,Spring 已封装得更好
❌ new Thread(() -> {}).start()
(线程无法管理,生产环境禁止)
❌ 在 Controller 里 sleep
(仍然是同步阻塞)
| 场景 | 推荐方式 |
|---|---|
| 简单异步 | Callable |
| 灵活异步 | CompletableFuture |
| 业务解耦 | @Async / MQ |
| 高并发 | 线程池 + MQ |
如果你愿意,可以告诉我:
我可以直接给你一整套可运行示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。