java異步調(diào)用的4種實(shí)現(xiàn)方法
一.利用多線程
直接new線程
Thread t = new Thread(){ @Override public void run() { longTimeMethod(); } };
使用線程池
private ExecutorService executor = Executors.newCachedThreadPool() ; public void fun() throws Exception { executor.submit(new Runnable(){ @override public void run() { try { //要執(zhí)行的業(yè)務(wù)代碼,我們這里沒有寫方法,可以讓線程休息幾秒進(jìn)行測試 Thread.sleep(10000); System.out.print("睡夠啦~"); }catch(Exception e) { throw new RuntimeException("報(bào)錯(cuò)啦??!"); } } }); }
二.采用Spring 的異步方法去執(zhí)行(無返回值)
在啟動(dòng)類或者配置類加上 @EnableAsync 注解.
package me.deweixu.aysncdemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; @EnableAsync @SpringBootApplication public class AysncDemoApplication { public static void main(String[] args) { SpringApplication.run(AysncDemoApplication.class, args); } }
先把longTimeMethod 封裝到Spring的異步方法中,這個(gè)方法一定要寫在Spring管理的類中,注意注解@Async
@Async注解可以用在方法上,也可以用在類上,用在類上,對類里面所有方法起作用
@Service public class AsynchronousService{ @Async public void springAsynchronousMethod(){ longTimeMethod(); } }
其他類調(diào)用這個(gè)方法。這里注意,一定要其他的類,如果在同類中調(diào)用,是不生效的。具體原因,可以去學(xué)習(xí)一下Spring AOP的原理
@Autowired private AsynchronousService asynchronousService; public void useAsynchronousMethod(){ //我們需要執(zhí)行的代碼1 asynchronousService.springAsynchronousMethod(); //我們需要執(zhí)行的代碼2 }
三.采用Spring 的異步方法+Future接收返回值
先把longTimeMethod 封裝到Spring的異步方法中,這個(gè)異步方法的返回值是Future的實(shí)例。這個(gè)方法一定要寫在Spring管理的類中,注意注解@Async。
@Service public class AsynchronousService{ @Async public Future springAsynchronousMethod(){ Integer result = longTimeMethod(); return new AsyncResult(result); } }
其他類調(diào)用這個(gè)方法。這里注意,一定要其他的類,如果在同類中調(diào)用,是不生效的。
如果調(diào)用之后接收返回值,不對返回值進(jìn)行操作則為異步操作,進(jìn)行操作則轉(zhuǎn)為同步操作,等待對返回值操作完之后,才會(huì)繼續(xù)執(zhí)行主進(jìn)程下面的流程
@Autowired private AsynchronousService asynchronousService; public void useAsynchronousMethod(){ Future future = asynchronousService.springAsynchronousMethod(); future.get(1000, TimeUnit.MILLISECONDS); }
四.原生Future方法
//我們需要執(zhí)行的代碼1 Future future = longTimeMethod2(); //我們需要執(zhí)行的代碼2 Integer result = future.get();
可以看到,我們調(diào)用longTimeMethod2返回一個(gè)Future對象(注意了,這里的longTimeMethod2當(dāng)然不是上面的longTimeMethod),然后處理“我們需要執(zhí)行的代碼2”,到了需要返回結(jié)果的時(shí)候直接調(diào)用future.get()便能獲取到返回值。下面我們來看看longTimeMethod2如何實(shí)現(xiàn)。
private Future longTimeMethod2() { //創(chuàng)建線程池 ExecutorService threadPool = Executors.newCachedThreadPool(); //獲取異步Future對象 Future future = threadPool.submit(new Callable() { @Override public Integer call() throwsException { return longTimeMethod(); } }); return future; }
參考
原文鏈接:https://www.jianshu.com/p/51f0555b232a
到此這篇關(guān)于java異步調(diào)用的4種實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)java異步調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
- Guava是Google發(fā)布的一個(gè)開源庫,主要提供了一些在Java開發(fā)中非常有用的工具類和API,不管是工作還是學(xué)習(xí)都是非常值得我們?nèi)ナ煜さ?,一起來看看?/div> 2023-03-03
Java中生成隨機(jī)數(shù)的4種方式與區(qū)別詳解
生成隨機(jī)數(shù)是我們?nèi)粘i_發(fā)經(jīng)常會(huì)遇到的一個(gè)功能,這篇文章主要給大家介紹了關(guān)于Java中生成隨機(jī)數(shù)的4種方式與區(qū)別、應(yīng)用場景的相關(guān)資料,4個(gè)方式分別是Random、ThreadLocalRandom、SecureRandom以及Math,需要的朋友可以參考下2021-06-06JSON數(shù)據(jù)轉(zhuǎn)換成Java對象的方法
就目前來講,將Java對象轉(zhuǎn)換成JSON對象還是相當(dāng)簡單的,但是 將JSON對象轉(zhuǎn)換成Java對象,就相對比較復(fù)雜了些2014-03-03Java畢業(yè)設(shè)計(jì)之多用戶宿舍管理系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了基于Java實(shí)現(xiàn)的多用戶宿舍管理系統(tǒng),本文采用了jsp、servlet、jdbc等技術(shù),文中示例代碼講解詳細(xì),需要的可以參考一下2022-02-02centos7如何通過systemctl啟動(dòng)springboot服務(wù)代替java -jar方式啟動(dòng)
這篇文章主要介紹了centos7如何通過systemctl啟動(dòng)springboot服務(wù)代替java -jar方式啟動(dòng),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01最新評(píng)論