先看如下代码:
创建了3个任务
@Component
public class AsyncTask {
/* @Async */
public Future<Boolean> doTask11() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(1000);
long end = System.currentTimeMillis();
System.out.println("任务1耗时:" + (end - start) + "毫秒");
return new AsyncResult<>(true);
}
/* @Async */
public Future<Boolean> doTask22() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(700);
long end = System.currentTimeMillis();
System.out.println("任务2耗时:" + (end - start) + "毫秒");
return new AsyncResult<>(true);
}
/* @Async */
public Future<Boolean> doTask33() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(600);
long end = System.currentTimeMillis();
System.out.println("任务3耗时:" + (end - start) + "毫秒");
return new AsyncResult<>(true);
}
}
任务调用
@RestController
@RequestMapping("tasks")
public class DoTask {
@Autowired
private AsyncTask asyncTask;
@RequestMapping("test1")
public String test1() throws Exception {
long start = System.currentTimeMillis();
Future<Boolean> a = asyncTask.doTask11();
Future<Boolean> b = asyncTask.doTask22();
Future<Boolean> c = asyncTask.doTask33();
// 这里循环是保证任务执行完毕再执行下面的语句
while (!a.isDone() || !b.isDone() || !c.isDone()) {
if (a.isDone() && b.isDone() && c.isDone()) {
break;
}
}
long end = System.currentTimeMillis();
String times = "任务全部完成,总耗时:" + (end - start) + "毫秒";
System.out.println(times);
return times;
}
}
由于我们是同步所以使用的时间是在3个任务的时间相加也就是2300毫秒以上
结果:
当很多任务的时候这无疑很难受。所以我们使用异步,则任务的时间为最大的的任务时间也就是1001秒
首先使用@EnableAsync开启异步
定义@Component@Async作为组件被容器扫描执行(也就是把代码中的@Async注释去掉)
结果:
使用场景:发送短信、发送邮件、app消息推送、节省运维凌晨发布任务时间提供效率