今天在這裏學習下使用springboot的異步調用async
首先使用@EnableAsync開啓異步功能
/**
* @author fengzp
* @date 17/5/8
* @email fengzp@gzyitop.com
* @company 廣州易站通計算機科技有限公司
*/
@SpringBootApplication
@EnableAsync
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
測試類
/**
* @author fengzp
* @date 17/5/8
* @email fengzp@gzyitop.com
* @company 廣州易站通計算機科技有限公司
*/
@Component
public class AsyncTest {
public static Random random =new Random();
/**
* @Async所修飾的函數不要定義爲static類型,不然異步調用不會生效
*
* 這裏經過返回Future<T>來返回異步調用的結果,實現異步回調
*/
@Async
public Future<String> test1() throws InterruptedException {
System.out.println("test1 begin");
long begin = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
System.out.println("test1 end " + (System.currentTimeMillis() - begin));
return new AsyncResult<String>("test1 is done!");
}
@Async
public Future<String> test2() throws InterruptedException {
System.out.println("test2 begin");
long begin = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
System.out.println("test2 end " + (System.currentTimeMillis() - begin));
return new AsyncResult<String>("test2 is done!");
}
@Async
public Future<String> test3() throws InterruptedException {
System.out.println("test3 begin");
long begin = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
System.out.println("test3 end " + (System.currentTimeMillis() - begin));
return new AsyncResult<String>("test3 is done!");
}
}
測試
/**
* @author fengzp
* @date 17/5/8
* @email fengzp@gzyitop.com
* @company 廣州易站通計算機科技有限公司
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class Test {
@Autowired
AsyncTest asyncTest;
@org.junit.Test
public void test() throws InterruptedException {
System.out.println("begin");
long begin = System.currentTimeMillis();
Future<String> test1 = asyncTest.test1();
Future<String> test2 = asyncTest.test2();
Future<String> test3 = asyncTest.test3();
while(true) {
if(test1.isDone() && test2.isDone() && test3.isDone())
break;
Thread.sleep(500);
}
System.out.println("end 耗時: " + (System.currentTimeMillis() - begin));
}
}
運行結果