一.利用多線程 直接new線程 使用線程池 二.採用Spring 的非同步方法去執行(無返回值) 在啟動類或者配置類加上 @EnableAsync 註解. 先把longTimeMethod 封裝到Spring的非同步方法中,這個方法一定要寫在Spring管理的類中,註意註解@Async @Async註解 ...
一.利用多線程
直接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 {
//要執行的業務代碼,我們這裡沒有寫方法,可以讓線程休息幾秒進行測試
Thread.sleep(10000);
System.out.print("睡夠啦~");
}catch(Exception e) {
throw new RuntimeException("報錯啦!!");
}
}
});
}
二.採用Spring 的非同步方法去執行(無返回值)
在啟動類或者配置類加上 @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(){
//我們需要執行的代碼1
asynchronousService.springAsynchronousMethod();
//我們需要執行的代碼2
}
三.採用Spring 的非同步方法+Future接收返回值
先把longTimeMethod 封裝到Spring的非同步方法中,這個非同步方法的返回值是Future的實例。這個方法一定要寫在Spring管理的類中,註意註解@Async。
@Service
public class AsynchronousService{
@Async
public Future springAsynchronousMethod(){
Integer result = longTimeMethod();
return new AsyncResult(result);
}
}
其他類調用這個方法。這裡註意,一定要其他的類,如果在同類中調用,是不生效的。
如果調用之後接收返回值,不對返回值進行操作則為非同步操作,進行操作則轉為同步操作,等待對返回值操作完之後,才會繼續執行主進程下麵的流程
@Autowired
private AsynchronousService asynchronousService;
public void useAsynchronousMethod(){
Future future = asynchronousService.springAsynchronousMethod();
future.get(1000, TimeUnit.MILLISECONDS);
}
四.原生Future方法
//我們需要執行的代碼1
Future future = longTimeMethod2();
//我們需要執行的代碼2
Integer result = future.get();
可以看到,我們調用longTimeMethod2返回一個Future對象(註意了,這裡的longTimeMethod2當然不是上面的longTimeMethod),然後處理“我們需要執行的代碼2”,到了需要返回結果的時候直接調用future.get()便能獲取到返回值。下麵我們來看看longTimeMethod2如何實現。
private Future longTimeMethod2() {
//創建線程池
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