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ǔ)充: