1.项目启动类上加@EnableAsync
@SpringBootApplication
@EnableAsync//允许异步
public class SpringbootScheduledApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootScheduledApplication.class, args);
}
}
2.无返回值情况:在需要执行的异步方法上加@Async
@Component
public class AsyncTask {
@Async
public void asyncTask1(){
System.out.println("异步任务1开始==========================================");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(new Date()));
System.out.println(sf.format(System.currentTimeMillis()));
System.out.println("异步任务1结束==========================================");
}
}
5.有返回值情况:
a.在需要执行的异步方法上加@Async
b.方法返回值为Future<V> , return new AsyncResult<String>("要返回的值");
c.调用时通过future.get()方法接收返回值,
@Async
public Future<String> asyncTask3(){
System.out.println("异步任务3开始==========================================");
int i=1/0;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new AsyncResult<String>("有返回值的异步任务");
}
4.测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class AsyncTaskTest {
@Resource
private AsyncTask asyncTask;
@Test
public void asyncTask1() {
asyncTask.asyncTask1();
System.out.println("主线程结束");
while (true){
}
}
@Test
public void asyncTask3() {
Future<String> future = asyncTask.asyncTask3();
log.info("begin to deal other Task!");
while (true) {
try {
if(future.isCancelled()){
log.info("deal async task is Cancelled");
break;
}
if (future.isDone() ) {
log.info("deal async task is Done");
log.info("return result is " + future.get());
break;
}
log.info("wait async task to end ...");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}
代码:
https://github.com/nokekang/springboot-scheduled.git