本文主要探究的是java并發(fā)編程callable與future的使用,分享了相關(guān)實(shí)例代碼,具體介紹如下。
站在用戶的角度思考問題,與客戶深入溝通,找到朝天網(wǎng)站設(shè)計(jì)與朝天網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋朝天地區(qū)。我們都知道實(shí)現(xiàn)多線程有2種方式,一種是繼承Thread,一種是實(shí)現(xiàn)Runnable,但這2種方式都有一個(gè)缺陷,在任務(wù)完成后無(wú)法獲取返回結(jié)果。要想獲得返回結(jié)果,就得使用Callable,Callable任務(wù)可以有返回值,但是沒法直接從Callable任務(wù)里獲取返回值;想要獲取Callabel任務(wù)的返回值,需要用到Future。所以Callable任務(wù)和Future模式,通常結(jié)合起來(lái)使用。
試想一個(gè)場(chǎng)景:需要一個(gè)帖子列表接口,除了需要返回帖子列表之外,還需要返回每條帖子的點(diǎn)贊列表和評(píng)論列表。一頁(yè)10條帖子來(lái)計(jì)算,這個(gè)接口需要訪問21次數(shù)據(jù)庫(kù),訪問一次數(shù)據(jù)庫(kù)按100ms計(jì)算,21次,累計(jì)時(shí)間為2.1s。這個(gè)響應(yīng)時(shí)間,怕是無(wú)法令人滿意的。怎么辦呢?異步化改造接口。
查出帖子列表后,迭代帖子列表,在循環(huán)里起10個(gè)線程,并發(fā)去獲取每條帖子的點(diǎn)贊列表,同時(shí)另起10個(gè)線程,并發(fā)去獲取每條帖子的評(píng)論列表。這樣改造之后,接口的響應(yīng)時(shí)間大大縮短,在200ms。這個(gè)時(shí)候就要用Callabel結(jié)合Future來(lái)實(shí)現(xiàn)。
private ListcreatePostResponseList(Page page,final String userId){ if(page.getCount()==0||page==null||page.getList()==null){ return null; } //獲取帖子列表 List circleResponseList = page.getList(); int size=circleResponseList.size(); ExecutorService commentPool = Executors.newFixedThreadPool(size); ExecutorService supportPool = Executors.newFixedThreadPool(size); try { List commentFutureList = new ArrayList (size); if (circleResponseList != null && circleResponseList.size() > 0) { for (PostResponse postResponse : circleResponseList) { final String circleId=postResponse.getId(); final String postUserId=postResponse.getUserId(); //查評(píng)論列表 Callable > callableComment = new Callable
>() { @Override public List
call() throws Exception { return circleReviewsBiz.getPostComments(circleId); } }; Future f = commentPool.submit(callableComment); commentFutureList.add(f); //查點(diǎn)贊列表 Callable > callableSupport = new Callable
>() { @Override public List
call() throws Exception { return circleZanBiz.findList(circleId); } }; Future supportFuture = supportPool.submit(callableSupport); commentFutureList.add(supportFuture); } } // 獲取所有并發(fā)任務(wù)的執(zhí)行結(jié)果 int i = 0; PostResponse temp = null; for (Future f : commentFutureList) { temp = circleResponseList.get(i); temp.setCommentList((List ) f.get(); temp.setSupportList((List ) f.get(); circleResponseList.set(i, temp); i++; } } catch (Exception e) { e.printStackTrace(); } finally { // 關(guān)閉線程池 commentPool.shutdown(); supportPool.shutdown(); } return circleResponseList; }