java多線程之CompletionService

當(dāng)使用ExecutorService啟動(dòng)了多個(gè)Callable后,每個(gè)Callable會(huì)產(chǎn)生一個(gè)Future,我們需要將多個(gè)Future存入一個(gè)線性表,用于之后處理數(shù)據(jù)。當(dāng)然,還有更復(fù)雜的情況,有5個(gè)生產(chǎn)者線程,每個(gè)生產(chǎn)者線程都會(huì)創(chuàng)建任務(wù),所有任務(wù)的Future都存放到同一個(gè)線性表中。另有一個(gè)消費(fèi)者線程,從線性表中取出Future進(jìn)行處理。

CompletionService正是為此而存在,它是一個(gè)更高級(jí)的ExecutorService,它本身自帶一個(gè)線程安全的線性表,無(wú)需用戶(hù)額外創(chuàng)建。它提供了2種方法從線性表中取出結(jié)果,poll()是非阻塞的,若目前無(wú)結(jié)果,返回一個(gè)null,線程繼續(xù)運(yùn)行不阻塞。take()是阻塞的,若當(dāng)前無(wú)結(jié)果,則線程阻塞,直到產(chǎn)生一個(gè)結(jié)果,被取出返回,線程才繼續(xù)運(yùn)行。

public class Test {? ? ??

public static void main(String[] args) throws InterruptedException, ExecutionException {? ? ? ??

? ExecutorService executor = Executors.newCachedThreadPool();? ? ? ?

?? CompletionServicecomp = new ExecutorCompletionService<>(executor);? ? ??

? ? for(int i = 0; i<5; i++) {? ? ? ??

? ? ? comp.submit(new Task());? ? ??

? ? }? ? ? ? ?

?executor.shutdown();? ? ? ??

? int count = 0, index = 1;? ? ? ? ?

?while(count<5) {? ? ? ? ? ? ??

Futuref = comp.poll();

if(f == null) {

? ? ? ? System.out.println(index + " 沒(méi)發(fā)現(xiàn)有完成的任務(wù)");

}else {

? ? ? ?System.out.println(index + "產(chǎn)生了一個(gè)隨機(jī)數(shù): " + f.get());

? ? ? ?count++;

}

index++;

TimeUnit.MILLISECONDS.sleep(500);

}

}

}


class Task implements Callable{

public Integer call() throws Exception {

Random rand = new Random();

TimeUnit.SECONDS.sleep(rand.nextInt(7));

return rand.nextInt();

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 下面是我自己收集整理的Java線程相關(guān)的面試題,可以用它來(lái)好好準(zhǔn)備面試。 參考文檔:-《Java核心技術(shù) 卷一》-...
    阿呆變Geek閱讀 14,910評(píng)論 14 507
  • 平時(shí)工作中經(jīng)常碰到個(gè)各種多線程,有時(shí)候搞不清它們之間到底有什么區(qū)別,這次來(lái)個(gè)總體的總結(jié),主要是以下這些:Execu...
    一只好奇的茂閱讀 2,350評(píng)論 1 35
  • 因?yàn)橐黄恼?,我看了瀝川往事,因?yàn)樾≌f(shuō),我最近又在追遇見(jiàn)王瀝川這部電視劇,電視拍的不錯(cuò),主演選的不錯(cuò),挺符合小說(shuō)的...
    cc1111閱讀 200評(píng)論 0 0
  • 一 今天刷過(guò)微博的人可能都知道這樣兩段視頻:【1】超級(jí)女聲海選現(xiàn)場(chǎng),十八歲選手還未開(kāi)口唱歌,首先解釋自己由于重感冒...
    陽(yáng)子閱讀 573評(píng)論 1 0
  • vhjhhuisnwbbjjsjbbdbjsjj
    仇志軒閱讀 168評(píng)論 0 5