Async 是一款 Java 異步處理框架。java
並行執行能夠大幅度提高程序的運行速度,有效利用 CPU 資源。git
可是單獨爲每次方法都使用線程池手寫,顯然不夠優雅,複用性也不好。github
支持接口類的動態代理異步spring
具體測試代碼,參見 async-test 模塊。 框架
<dependency> <groupId>com.github.houbb</groupId> <artifactId>async-core</artifactId> <version>0.0.2</version> </dependency>
當前版本沒有引入 CGLIB 等字節碼包,須要實現接口才能異步並行。異步
若是不實現接口,則不實現異步並行。async
下個版本會添加 CGLIB,則不用實現接口。maven
import com.github.houbb.async.core.model.async.AsyncResult; /** * 用戶服務接口 * @author binbin.hou * date 2019/3/7 * @since 0.0.1 */ public interface UserService { /** * 查詢用戶信息 * @param id 主鍵 * @return 結果 */ AsyncResult<String> queryUser(final String id); }
public class UserServiceImpl implements UserService { @Override public AsyncResult<String> queryUser(String id) { System.out.println("開始根據用戶id 查詢用戶信息 " + id); try { // 沉睡模擬處理耗時 TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } final String result = id + "-result"; System.out.println("結束根據用戶id 查詢用戶信息 " + result); AsyncResult<String> asyncResult = new AsyncResult<>(); asyncResult.setValue(result); return asyncResult; } }
常規使用方式ide
/** * 默認不使用代理 */ @Test public void queryUserTest() { long start = System.currentTimeMillis(); UserService userService = new UserServiceImpl(); AsyncResult<String> result = userService.queryUser("123"); AsyncResult<String> result2 = userService.queryUser("1234"); System.out.println("查詢結果" + result.getResult()); System.out.println("查詢結果" + result2.getResult()); long end = System.currentTimeMillis(); System.out.println("共計耗時: " + (end-start)); }
開始根據用戶id 查詢用戶信息 123 結束根據用戶id 查詢用戶信息 123-result 開始根據用戶id 查詢用戶信息 1234 結束根據用戶id 查詢用戶信息 1234-result 查詢結果123-result 查詢結果1234-result 共計耗時: 6009
/** * 使用動態代理 */ @Test public void queryUserDynamicProxyTest() { long start = System.currentTimeMillis(); UserService userService = new UserServiceImpl(); UserService userServiceProxy = (UserService) AsyncProxy.getProxy(userService); AsyncResult<String> result = userServiceProxy.queryUser("123"); AsyncResult<String> result2 = userServiceProxy.queryUser("1234"); System.out.println("查詢結果" + result.getResult()); System.out.println("查詢結果" + result2.getResult()); long end = System.currentTimeMillis(); System.out.println("共計耗時: " + (end-start)); }
開始根據用戶id 查詢用戶信息 123 開始根據用戶id 查詢用戶信息 1234 結束根據用戶id 查詢用戶信息 123-result 結束根據用戶id 查詢用戶信息 1234-result 查詢結果123-result 查詢結果1234-result 共計耗時: 3009
一樣的功能實現,節約了將近一半的時間。測試
可結合 spring aop 使用的註解