掃描二維碼
隨時(shí)隨地手機(jī)看文章
@Component
public?class?Task?{
?
????public?static?Random?random?=new?Random();
?
????public?void?doTaskOne()?throws?Exception?{
????????System.out.println("開始做任務(wù)一");
????????long?start?=?System.currentTimeMillis();
????????Thread.sleep(random.nextInt(10000));
????????long?end?=?System.currentTimeMillis();
????????System.out.println("完成任務(wù)一,耗時(shí):"? ?(end?-?start)? ?"毫秒");
????}
?
????public?void?doTaskTwo()?throws?Exception?{
????????System.out.println("開始做任務(wù)二");
????????long?start?=?System.currentTimeMillis();
????????Thread.sleep(random.nextInt(10000));
????????long?end?=?System.currentTimeMillis();
????????System.out.println("完成任務(wù)二,耗時(shí):"? ?(end?-?start)? ?"毫秒");
????}
?
????public?void?doTaskThree()?throws?Exception?{
????????System.out.println("開始做任務(wù)三");
????????long?start?=?System.currentTimeMillis();
????????Thread.sleep(random.nextInt(10000));
????????long?end?=?System.currentTimeMillis();
????????System.out.println("完成任務(wù)三,耗時(shí):"? ?(end?-?start)? ?"毫秒");
????}
?
}
在單元測試用例中,注入Task對象,并在測試用例中執(zhí)行doTaskOne、doTaskTwo、doTaskThree三個(gè)函數(shù)。@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes?=?Application.class)
public?class?ApplicationTests?{
?
????@Autowired
????private?Task?task;
?
????@Test
????public?void?test()?throws?Exception?{
????????task.doTaskOne();
????????task.doTaskTwo();
????????task.doTaskThree();
????}
?
}
執(zhí)行單元測試,可以看到類似如下輸出:開始做任務(wù)一
完成任務(wù)一,耗時(shí):4256毫秒
開始做任務(wù)二
完成任務(wù)二,耗時(shí):4957毫秒
開始做任務(wù)三
完成任務(wù)三,耗時(shí):7173毫秒
任務(wù)一、任務(wù)二、任務(wù)三順序的執(zhí)行完了,換言之doTaskOne、doTaskTwo、doTaskThree三個(gè)函數(shù)順序的執(zhí)行完成。@Component
public?class?Task?{
?
????@Async
????public?void?doTaskOne()?throws?Exception?{
????????//?同上內(nèi)容,省略
????}
?
????@Async
????public?void?doTaskTwo()?throws?Exception?{
????????//?同上內(nèi)容,省略
????}
?
????@Async
????public?void?doTaskThree()?throws?Exception?{
????????//?同上內(nèi)容,省略
????}
?
}
為了讓@Async
注解能夠生效,還需要在Spring Boot的主程序中配置@EnableAsync
,如下所示:@SpringBootApplication
@EnableAsync
public?class?Application?{
?
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(Application.class,?args);
????}
?
}
此時(shí)可以反復(fù)執(zhí)行單元測試,您可能會(huì)遇到各種不同的結(jié)果,比如:注:@Async所修飾的函數(shù)不要定義為static類型,這樣異步調(diào)用不會(huì)生效
@Async
public?Future?doTaskOne()?throws?Exception? {
????System.out.println("開始做任務(wù)一");
????long?start?=?System.currentTimeMillis();
????Thread.sleep(random.nextInt(10000));
????long?end?=?System.currentTimeMillis();
????System.out.println("完成任務(wù)一,耗時(shí):"? ?(end?-?start)? ?"毫秒");
????return?new?AsyncResult<>("任務(wù)一完成");
}
按照如上方式改造一下其他兩個(gè)異步函數(shù)之后,下面我們改造一下測試用例,讓測試在等待完成三個(gè)異步調(diào)用之后來做一些其他事情。@Test
public?void?test()?throws?Exception?{
?
????long?start?=?System.currentTimeMillis();
?
????Future?task1?=?task.doTaskOne();
????Future?task2?=?task.doTaskTwo();
????Future?task3?=?task.doTaskThree();
?
????while(true)?{
????????if(task1.isDone()?