java異步調用的4種實現(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è)務代碼,我們這里沒有寫方法,可以讓線程休息幾秒進行測試
Thread.sleep(10000);
System.out.print("睡夠啦~");
}catch(Exception e) {
throw new RuntimeException("報錯啦!!");
}
}
});
}
二.采用Spring 的異步方法去執(zhí)行(無返回值)
在啟動類或者配置類加上 @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的異步方法中,這個方法一定要寫在Spring管理的類中,注意注解@Async
@Async注解可以用在方法上,也可以用在類上,用在類上,對類里面所有方法起作用
@Service
public class AsynchronousService{
@Async
public void springAsynchronousMethod(){
longTimeMethod();
}
}
其他類調用這個方法。這里注意,一定要其他的類,如果在同類中調用,是不生效的。具體原因,可以去學習一下Spring AOP的原理
@Autowired
private AsynchronousService asynchronousService;
public void useAsynchronousMethod(){
//我們需要執(zhí)行的代碼1
asynchronousService.springAsynchronousMethod();
//我們需要執(zhí)行的代碼2
}
三.采用Spring 的異步方法+Future接收返回值
先把longTimeMethod 封裝到Spring的異步方法中,這個異步方法的返回值是Future的實例。這個方法一定要寫在Spring管理的類中,注意注解@Async。
@Service
public class AsynchronousService{
@Async
public Future springAsynchronousMethod(){
Integer result = longTimeMethod();
return new AsyncResult(result);
}
}
其他類調用這個方法。這里注意,一定要其他的類,如果在同類中調用,是不生效的。
如果調用之后接收返回值,不對返回值進行操作則為異步操作,進行操作則轉為同步操作,等待對返回值操作完之后,才會繼續(xù)執(zhí)行主進程下面的流程
@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();
可以看到,我們調用longTimeMethod2返回一個Future對象(注意了,這里的longTimeMethod2當然不是上面的longTimeMethod),然后處理“我們需要執(zhí)行的代碼2”,到了需要返回結果的時候直接調用future.get()便能獲取到返回值。下面我們來看看longTimeMethod2如何實現(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
到此這篇關于java異步調用的4種實現(xiàn)方法的文章就介紹到這了,更多相關java異步調用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java畢業(yè)設計之多用戶宿舍管理系統(tǒng)的實現(xiàn)
這篇文章主要介紹了基于Java實現(xiàn)的多用戶宿舍管理系統(tǒng),本文采用了jsp、servlet、jdbc等技術,文中示例代碼講解詳細,需要的可以參考一下2022-02-02
centos7如何通過systemctl啟動springboot服務代替java -jar方式啟動
這篇文章主要介紹了centos7如何通過systemctl啟動springboot服務代替java -jar方式啟動,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01

