在使用Java做后端时,基本都避不开需要有异步任务,我们也知道使能实现异步任务的方法有很多,那么都有哪些常用的呢?
- 使用Thread类:可以创建一个新的线程来执行异步任务。例如:
Thread thread = new Thread(() -> {
// 异步任务的代码
});
thread.start();
- 使用ExecutorService类:可以使用线程池来管理异步任务的执行。例如:
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.submit(() -> {
// 异步任务的代码
});
executor.shutdown();
- 使用CompletableFuture类:可以使用CompletableFuture来创建异步任务,并且可以链式地组合多个异步任务。例如:
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
// 异步任务的代码
});
4.使用Future接口:可以使用Future来获取异步任务的结果。例如:
ExecutorService executor = Executors.newFixedThreadPool(10);
Future<String> future = executor.submit(() -> {
// 异步任务的代码
return "Hello";
});
String result = future.get();
executor.shutdown();
但是现在我们基本都会使用框架,如果在使用框架的基础上,有没有更加快捷简便的方法?答案是肯定的:
1.使用@Async注解:在需要异步执行的方法上添加@Async注解,Spring会自动将该方法放入线程池中执行。需要在配置类上添加@EnableAsync注
@Service
public class MyService {
@Async
public void asyncMethod() {
// 异步执行的方法体
}
}
2.使用CompletableFuture:CompletableFuture是Java 8引入的一个类,可以用于实现异步任务。可以使用CompletableFuture.supplyAsync()或CompletableFuture.runAsync()方法来创建异步任务。
@Service
public class MyService {
public CompletableFuture<String> asyncMethod() {
return CompletableFuture.supplyAsync(() -> {
// 异步执行的方法体
return "result";
});
}
}
3.使用@Scheduled注解:@Scheduled注解可以用于定时执行任务,也可以用于实现异步任务。可以在方法上添加@Scheduled注解,并指定cron表达式或固定的时间间隔。
@Service
public class MyService {
public CompletableFuture<String> asyncMethod() {
return CompletableFuture.supplyAsync(() -> {
// 异步执行的方法体
return "result";
});
}
}
你还有其他常用的推荐方法吗?
如何找到开发技术问题答案
- 方式一:官网文档 – 不一定全
- 方式二:技术社区搜索帖子 – 不知道有哪些社区
- 方式三:通过百度、谷歌等搜索 – 广告太多了
- 方式四:通过AI搜索答案 – 直接给出问题答案
通过AI搜索的效果