并發(fā)補(bǔ)充

1. 并發(fā)編程

1.1 ForkJoin處理線程池任務(wù)

(1)任務(wù)類型:
CPU密集型:CPU數(shù) = 核心線程數(shù)
I/O密集型: 核心線程數(shù) = CPU * (1 + 平均等待時(shí)間/平均工作時(shí)間)
(2)思考:如何充分利用多核CPU資源,計(jì)數(shù)一個(gè)很大的數(shù)組之和?
方案1:利用多線程拆分任務(wù),hash后采用分治 + 分段相加方式累加計(jì)數(shù)
注1:線程一定越多越好嗎?不一定,CPU核數(shù)一定,線程數(shù)設(shè)定越多越多次數(shù)進(jìn)行上下文切換,大大降低效率
方案2:forkJoin思想

if ((hi - lo) <= seq - cutoff) {
  for (i = lo; i < hi; i++) {
    result += arr[i];
  } else {
    RecursiveSumTask = new RecursiveSumTask(executorSevice, arr, lo, (hi + lo) / 2);
    RecursiveSumTask = new RecursiveSumTask(executorSevice, arr, (hi + lo) / 2, hi);
    Future<long> lr = executorService.submit(left);
    Future<long> rr = executorService.submit(right);
    result = lr + rr;
  }
} 

注1:小問(wèn)題:該模式下,若采用定長(zhǎng)線程池,在拆解任務(wù)過(guò)程中,可能由于線程資源不夠,造成死鎖
注2:應(yīng)用場(chǎng)景:java并發(fā)包中提供的fork/join并行計(jì)算框架,用來(lái)支持分治任務(wù)模型

1.2 ForkJoin并發(fā)框架

傳統(tǒng)線程池ThrealPool的缺點(diǎn):(1)無(wú)法對(duì)大任務(wù)進(jìn)行拆分 (2)工作線程從隊(duì)列中獲取任務(wù)時(shí)存在競(jìng)爭(zhēng)
(1)特性:
允許其他線程向其提交任務(wù),并將一個(gè)大任務(wù)拆分為多個(gè)
同時(shí)工作線程間支持任務(wù)竊取
(2)使用場(chǎng)景:處理計(jì)算密集型任務(wù)
(3)工作原理:


工作原理.png
  • 多個(gè)線程,每個(gè)維護(hù)一個(gè)工作隊(duì)列workQueue,存入workQueues[]中
  • 提交任務(wù),無(wú)工作Thread則創(chuàng)建,有工作Thread則喚醒并執(zhí)行
  • 分配任務(wù):自己取pop;任務(wù)竊取poll
    注:工作竊取優(yōu)點(diǎn):重復(fù)利用閑置線程進(jìn)行并行計(jì)算;減少線程競(jìng)爭(zhēng)

2. Future及CompleteableFuture

2.1 創(chuàng)建線程的幾種方式及區(qū)別

2.2 Callable & Future

(1)直接繼承Thread或?qū)崿F(xiàn)Runnable接口都可創(chuàng)建線程,但存在無(wú)返回值的缺點(diǎn);
(2)使用過(guò)程

FutureTask task = new FutureTask(new Callable() {
  public Object call() throws Exception {
     Thread.sleep(2000);
      return result;
  }
});

使用過(guò)程圖.png

(3)使用場(chǎng)景:優(yōu)化串行流程
優(yōu)化串行流程.png

(4)使用局限性:
無(wú)法組合任務(wù);無(wú)法對(duì)多個(gè)任務(wù)串行調(diào)用;有一個(gè)FutureTask任務(wù)阻塞就全部阻塞
(5)優(yōu)化方式:CompletionService
通過(guò)阻塞隊(duì)列 + FutureTask實(shí)現(xiàn)
已完成對(duì)任務(wù)存入阻塞隊(duì)列中,用隊(duì)列中的take方法可調(diào)用完成的result,總結(jié)果由get()獲取
(6)思考Callable與Future會(huì)產(chǎn)生新線程嗎?
不會(huì),只是一種管理任務(wù)的方式,java中僅有new Thread一種生成新線程方式
(7)completeFuture:是Future擴(kuò)展接口,實(shí)現(xiàn)了對(duì)任務(wù)的編排功能
補(bǔ)充:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容