今天又翻了一下書的目錄,第一章在這之后就結(jié)束了。也就是說,這本書所涉及到的新的知識已經(jīng)全部點(diǎn)到了。
書的其余部分就是對這幾個概念做一些基礎(chǔ)知識的補(bǔ)充以及更深層次的實(shí)踐。
最后兩個小節(jié)的內(nèi)容較少,所以合成一篇文章來總結(jié)。
上一篇:Lambda&Java多核編程-0-從集合到流
從串行到并行
串行指一個步驟一個步驟地處理,也就是通常情況下,代碼一行一行地執(zhí)行。
如果將我們常用的迭代器式的循環(huán)展開的話,就是串行執(zhí)行了循環(huán)體內(nèi)所定義的操作:
sum += arr.get(0); sum += arr.get(1); sum += arr.get(2);//...
在書的一開始,就提到Java需要支持集合的并行計(jì)算(而Lambda為這個需求提供了可能)。
這些功能將全部被實(shí)現(xiàn)于庫代碼中,對于我們使用者,實(shí)現(xiàn)并行的復(fù)雜性被大大降低(最低程度上只需要調(diào)用相關(guān)方法)。
另外,關(guān)于并發(fā)與并行這兩個概念,其實(shí)是不同的,如果不明白的話請自行了解,在此只引用一句非常流行的話:
一個是關(guān)于代碼結(jié)構(gòu),一個是關(guān)于代碼執(zhí)行。
如果我們想將一個計(jì)算任務(wù)均勻地分配給CPU的四個內(nèi)核,我們會給每個核分配一個用于計(jì)算的線程,每個線程上進(jìn)行整個任務(wù)的子任務(wù)。
書上有一段非常形象的偽代碼:
if the task list contains more than N/4 elements { leftTask = task.getLeftHalf() rightTask = task.getRightHalf() doInparallel { leftResult = leftTask.solve() rightResult = rightTask.solve() } result = combine(leftResult, rightResult) } else { result = task.solveSequentially() }
代碼中,將每四個任務(wù)元素分為一組,用四個內(nèi)核對其進(jìn)行并行處理,然后每兩組進(jìn)行一次結(jié)果的合并,最終得到整個任務(wù)隊(duì)列的最終結(jié)果。
從整體處理流程上看,先將任務(wù)隊(duì)列遞歸地進(jìn)行分組,并行處理每一組,然后將結(jié)果遞歸地進(jìn)行合并(合并通過管道終止操作實(shí)現(xiàn))。
Java8之前,開發(fā)者們使用一種針對集合的fork/join框架來實(shí)現(xiàn)該模式。
然而現(xiàn)在,想對代碼進(jìn)行性能優(yōu)化,就是一件非常容易的事了。
還記得我們上一節(jié)中所得出的最終代碼:
long validContactCounter