Async 是一款 Java 異步處理框架。
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的石龍網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
并行執(zhí)行可以大幅度提升程序的運(yùn)行速度,有效利用 CPU 資源。
但是單獨(dú)為每次方法都使用線程池手寫,顯然不夠優(yōu)雅,復(fù)用性也很差。
支持接口類的動(dòng)態(tài)代理異步
具體測(cè)試代碼,參見 async-test 模塊。
com.github.houbb
async-core
0.0.2
當(dāng)前版本沒有引入 CGLIB 等字節(jié)碼包,需要實(shí)現(xiàn)接口才能異步并行。
如果不實(shí)現(xiàn)接口,則不實(shí)現(xiàn)異步并行。
下個(gè)版本會(huì)添加 CGLIB,則不用實(shí)現(xiàn)接口。
import com.github.houbb.async.core.model.async.AsyncResult;
/**
* 用戶服務(wù)接口
* @author binbin.hou
* date 2019/3/7
* @since 0.0.1
*/
public interface UserService {
/**
* 查詢用戶信息
* @param id 主鍵
* @return 結(jié)果
*/
AsyncResult queryUser(final String id);
}
public class UserServiceImpl implements UserService {
@Override
public AsyncResult queryUser(String id) {
System.out.println("開始根據(jù)用戶id 查詢用戶信息 " + id);
try {
// 沉睡模擬處理耗時(shí)
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
final String result = id + "-result";
System.out.println("結(jié)束根據(jù)用戶id 查詢用戶信息 " + result);
AsyncResult asyncResult = new AsyncResult<>();
asyncResult.setValue(result);
return asyncResult;
}
}
常規(guī)使用方式
/**
* 默認(rèn)不使用代理
*/
@Test
public void queryUserTest() {
long start = System.currentTimeMillis();
UserService userService = new UserServiceImpl();
AsyncResult result = userService.queryUser("123");
AsyncResult result2 = userService.queryUser("1234");
System.out.println("查詢結(jié)果" + result.getResult());
System.out.println("查詢結(jié)果" + result2.getResult());
long end = System.currentTimeMillis();
System.out.println("共計(jì)耗時(shí): " + (end-start));
}
開始根據(jù)用戶id 查詢用戶信息 123
結(jié)束根據(jù)用戶id 查詢用戶信息 123-result
開始根據(jù)用戶id 查詢用戶信息 1234
結(jié)束根據(jù)用戶id 查詢用戶信息 1234-result
查詢結(jié)果123-result
查詢結(jié)果1234-result
共計(jì)耗時(shí): 6009
/**
* 使用動(dòng)態(tài)代理
*/
@Test
public void queryUserDynamicProxyTest() {
long start = System.currentTimeMillis();
UserService userService = new UserServiceImpl();
UserService userServiceProxy = (UserService) AsyncProxy.getProxy(userService);
AsyncResult result = userServiceProxy.queryUser("123");
AsyncResult result2 = userServiceProxy.queryUser("1234");
System.out.println("查詢結(jié)果" + result.getResult());
System.out.println("查詢結(jié)果" + result2.getResult());
long end = System.currentTimeMillis();
System.out.println("共計(jì)耗時(shí): " + (end-start));
}
開始根據(jù)用戶id 查詢用戶信息 123
開始根據(jù)用戶id 查詢用戶信息 1234
結(jié)束根據(jù)用戶id 查詢用戶信息 123-result
結(jié)束根據(jù)用戶id 查詢用戶信息 1234-result
查詢結(jié)果123-result
查詢結(jié)果1234-result
共計(jì)耗時(shí): 3009
同樣的功能實(shí)現(xiàn),節(jié)約了將近一半的時(shí)間。
Async-01-項(xiàng)目模塊說明
Async-02-CGLIB代理.md
可結(jié)合 spring aop 使用的注解