摘要:異步程序在順序執(zhí)行時,不等待異步調(diào)用的語句返回結(jié)果就執(zhí)行后面的程序當(dāng)一個異步過程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結(jié)果。
同步
程序按照定義順序依次執(zhí)行,每一行程序都必須等待上一行程序執(zhí)行完成之后才能執(zhí)行,就是在發(fā)出一個功能調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用就不返回。
異步程序在順序執(zhí)行時,不等待異步調(diào)用的語句返回結(jié)果就執(zhí)行后面的程序,當(dāng)一個異步過程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結(jié)果。
同步代碼Service層:
public void test() throws InterruptedException { Thread.sleep(2000); for (int i = 0; i < 1000; i++) { System.out.println("i = " + i); } }
Controller層:
@GetMapping("test") public String test() { try { Thread.sleep(1000); System.out.println("主線程開始"); for (int j = 0; j < 100; j++) { System.out.println("j = " + j); } asyncService.test(); System.out.println("主線程結(jié)束"); return "async"; } catch (InterruptedException e) { e.printStackTrace(); return "fail"; } }
瀏覽器中請求 http://localhost:8080/test
控制臺打印順序:
主線程開始
打印j循環(huán)
打印i循環(huán)
主線程結(jié)束
異步代碼在Service層的test方法上加上@Async注解,同時為了是異步生效在啟動類上加上@EnableAsync注解
Service層:
@Async public void test() throws InterruptedException { Thread.sleep(2000); for (int i = 0; i < 1000; i++) { System.out.println("i = " + i); } }
Controller不變,啟動類加上@EnableAsync:
@SpringBootApplication @EnableAsync public class AsyncApplication { public static void main(String[] args) { SpringApplication.run(AsyncApplication.class, args); } }
再次請求打印順序如下:
主線程開始
打印j循環(huán)
主線程結(jié)束
打印i循環(huán)
代碼: async
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77551.html
摘要:異步處理方式調(diào)用之后,不返回任何數(shù)據(jù)。在有返回值的異步調(diào)用中,異步處理拋出異常,會直接拋出異常,異步任務(wù)結(jié)束,原有處理結(jié)束執(zhí)行。 1.使用背景 在項目中,當(dāng)訪問其他人的接口較慢或者做耗時任務(wù)時,不想程序一直卡在耗時任務(wù)上,想程序能夠并行執(zhí)行,我們可以使用多線程來并行的處理任務(wù),也可以使用spring提供的異步處理方式@Async。 2.異步處理方式 調(diào)用之后,不返回任何數(shù)據(jù)。 調(diào)用之...
摘要:定義異步方法,使用來返回異步調(diào)用的結(jié)果開始做任務(wù)一完成任務(wù)一,當(dāng)前線程,耗時毫秒任務(wù)一完成開始做任務(wù)二完成任務(wù)二,當(dāng)前線程,耗時毫秒任務(wù)二完成開始做任務(wù)三完成任務(wù)三,當(dāng)前線程,耗時毫秒任務(wù)三完成調(diào)用執(zhí)行異步回調(diào)異步回調(diào)結(jié)束調(diào)用結(jié)果開 定義異步方法,使用Future來返回異步調(diào)用的結(jié)果 @Async public Future firstTask() throws Int...
摘要:定義模擬耗時操作調(diào)用失敗調(diào)用成功調(diào)用執(zhí)行順序循環(huán)循環(huán)調(diào)用成功代碼異步回調(diào) 定義ListenableFuture public void getListenableFuture() { ListenableFutureTask task = new ListenableFutureTask(new Callable() { @Override ...
摘要:最開始是使用的正常的普通方式去寫入,但是量太大了,所以就嘗試使用多線程來寫入。下面我們就來介紹一下怎么使用多線程進行導(dǎo)入。配置線程池我們需要創(chuàng)建一個類來設(shè)置線程池的各種配置。它可以使主線程一直等到所有的子線程執(zhí)行完之后再執(zhí)行。 前言: 最近在工作中需要將一大批數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫中,因為種種原因這些數(shù)據(jù)不能使用同步數(shù)據(jù)的方式來進行復(fù)制,而是提供了一批文本,文本里面有很多行url地址,需要的...
閱讀 3214·2021-11-25 09:43
閱讀 3217·2021-11-23 09:51
閱讀 3529·2019-08-30 13:08
閱讀 1584·2019-08-29 12:48
閱讀 3605·2019-08-29 12:26
閱讀 410·2019-08-28 18:16
閱讀 2575·2019-08-26 13:45
閱讀 2441·2019-08-26 12:15