Chapter 2-3. Fork/Join Framework
ไฝ่ฌfork/Join
Fork/JoinๆฏๅพJDK7้ๅงๆไพ็ไธๅ็จๆผๅนณ่กๅท่กไปปๅ็ๆกๆถ, ๆฏไธๅๅฏไปฅๆๆฏไปปๅๅๅฒๆๅคๅๅญไปปๅ, ไธฆไธๆ็ตๅฝๆดๅๅๅญไปปๅ็็ตๆไธฆๅพๅฐๆฏไปปๅไน็ตๆ็ๆกๆถ.
Fork: ๅณๆไธๅๆฏไปปๅๅๅฒๆๅคๅๅญไปปๅไธฆไธๅนณ่กๅฐๅท่ก.
Join: ๅไฝตๅๅฒๅพ็ๅญไปปๅไนๅท่ก็ตๆ, ๆ็ตๅพๅฐๆฏไปปๅไน็ตๆ.
ไพๅฆ: ่จ็ฎๆดๆธ1~10000็ๅ ็ธฝ, ๅฏไปฅๅๅฒๆ100ๅๅญไปปๅ, ๆฏๅๅญไปปๅๅๅฅๅฐ100ๅๆดๆธ้ฒ่กๅ ็ธฝ, ๆ็ตๅฝๆด้100ๅๅญไปปๅ็็ตๆ.
Fork/Join็้ไฝๆต็จๅๅฆไธ:

Work-Stealingๆผ็ฎๆณ
Work-stealingๆผ็ฎๆณๆฏๆๆๅๅท่ก็ทๅพๅ ถๅฎqueue่ฃก"็ซๅ(steal)"ไปปๅไพๅท่ก, ๅ ถ้ไฝๆต็จๅๅฆไธ:

่ณๆผ็บไฝ่ฆๆ้็จฎๆผ็ฎๆณๅข? ๅ่จญ็ถๅๆไธๅๆฏ่ผๅคง็ๆฏไปปๅ, ๆๅๅฏไปฅๆ้ๅๆฏไปปๅๅๅฒ็บ่ฅๅนฒๅไบไธ็ธไพ็ๅญไปปๅ, ็ถ่็บไบๆธๅฐๅท่ก็ทไน้็็ซถ็ญ, ไพฟๆ้ไบๅญไปปๅๅๅฅๆพๅฐไธๅ็queue่ฃก, ไธฆ็บๆฏๅqueueๅปบ็ซไธๅๅฎ็จ็ๅท่ก็ทไพๅท่กqueue่ฃก็ไปปๅ, ๅท่ก็ท่queueไธไธๅฐๆ, ๅณAๅท่ก็ท่ฒ ่ฒฌ่็queue A่ฃก็ไปปๅ, ไฝๆฏๆ็ๅท่ก็ทๅฏ่ฝๆๅ ๆ่ชๅทฑ็queueไธญ็ไปปๅๅฎๆ, ่ๅ ถๅฎๅท่ก็ทๅฐๆ็queue่ฃกๅป้ๆไปปๅๅจ็ญๅพ ่็ไธญ. ๆไปฅ, ๅทฒ็ถๅฎๆๆๆไปปๅ็ๅท่ก็ท่ๅ ถๅจ้ฃ้ไนพ็ญ, ๅไธๅฆๅปๅนซๅ ถๅฎๅท่ก็ทๅฎๆๅฉไธ็ไปปๅ, ๆผๆฏ้ๅๅทฒ็ถๆฒไบๅ็ๅท่ก็ทๅฐฑๆๅปๅ ถๅฎ็queue่ฃก็ซๅไธๅไปปๅไพๅท่ก. ๅจ้็จฎๆ ๆณไธ, ๅฎๅๆๅญๅๅไธๅqueue, ๆไปฅ็บไบๆธๅฐ็ซๅไปปๅ็ๅท่ก็ท่่ขซ็ซๅไปปๅ็ๅท่ก็ทไน้็็ซถ็ญ, ้ๅธธๆไฝฟ็จ้ๅไฝๅ(double-ended queue, a.k.a Deque, ๅ ถ็ผ้ณ็บ"deck") --- ่ขซ็ซๅไปปๅ็ๅท่ก็ทๆฐธ้ ๅพ้ๅไฝๅ็้ ญ้จๅๅบไปปๅไพๅท่ก, ่็ซๅไปปๅ็ๅท่ก็ทๆฐธ้ ๅพ้ๅไฝๅ็ๅฐพ้จๅๅบไปปๅไพๅท่ก.
Work-stealing็ๅช้ป: ๅ ๅๅฐๅฉ็จๅท่ก็ท้ฒ่กๅนณ่ก้็ฎ.
Work-stealing็็ผบ้ป: ๅจๆไบๆ ๆณไธ้ๆฏๅญๅจ็ซถ็ญ, ่ญฌๅฆ้ๅไฝๅ่ฃกๅชๆไธๅไปปๅๆ. ้คไบ้้ปไนๅค, ๅฆไธๅ็ผบ้ปๆฏๅ ถๆถ่ไบๆดๅค็็ณป็ตฑ่ณๆบ, ่ญฌๅฆๅปบ็ซไบๅคๅๅท่ก็ทไปฅๅ้ๅไฝๅ.
Fork/Join็ๅบๆฌไป็ดน
ๅ้ข็้จๅๅทฒ็ถๆธ ๆฅๅฐ่ชชๆไบFork/Joinๆกๆถ็้ๆฑไบ, ๅไพๅฐฑๅฏไปฅๆ่ไธไธ่ฅ่ฆ่จญ่จไธๅFork/Joinๆกๆถ็่ฉฑ่ฉฒ่ฆๅฆไฝ่จญ่จ.
็ฌฌไธๆญฅ, ๅๅฒไปปๅ: ้ฆๅ ้่ฆๆไธๅfork้กๅฅไพๆๆฏไปปๅๅๅฒๆๅญไปปๅ, ่ฅๅๅฒๅพ็ๅญไปปๅ้ๆฏๅคชๅคง, ๅฐฑ็นผ็บๅๅฒ, ็ดๅฐๅญไปปๅๅค ๅฐ็บๆญข.
็ฌฌไบ้จ, ๅท่กไปปๅไธฆๅไฝต็ตๆ: ๅๅฒ็ๅญไปปๅๅๅฅๆพๅจ้ๅไฝๅไธญ, ็ถๅพๅนพๅๅๅ็ๅท่ก็ทๅๅฅๅพ้ๅไฝๅ่ฃกๅๅพไปปๅไธฆๅท่ก. ๅญไปปๅๅท่กๅฎ็็ตๆ้ฝ็ตฑไธๆพๅจไธๅไฝๅ่ฃก, ๅๅไธๅๅท่ก็ทๅพ้ๅไฝๅ่ฃกๆฟ่ณๆ, ไธฆไธๅไฝต้ไบ่ณๆ.
Fork/Joinไฝฟ็จๅ ฉๅ้กๅฅไพๅฎๆไธ่ฟฐ็ๅ ฉไปถไบๆ :
ForkJoinTask: ่ฆไฝฟ็จFork/Joinๆกๆถ, ๅฟ ้ ๅ ๅปบ็ซไธๅForkJoinไปปๅ. ๅ ถๆไพๅจไปปๅไธญๅท่กfork()่join()ๆไฝไนๆฉๅถ, ้ๅธธๆ ๆณไธๆๅไธ้่ฆ็ดๆฅ็นผๆฟForkJoinTask้กๅฅ, ่ๅช้่ฆ็นผๆฟๅ ถๅญ้กๅฅ, ๅฆไธ:
RecursiveAction: ็จๆผๆฒๆๅๅณๅผ็ไปปๅ.
RecursiveTask: ็จๆผๆๅๅณๅผ็ไปปๅ.
ForkJoinPool: ForkJoinTask้่ฆ้้ForkJoinPoolไพๅท่ก, ไปปๅๅๅฒๅบ็ๅญไปปๅๆๆทปๅ ๅฐ็ถๅๅทฅไฝๅท่ก็ทๆ็ถญ่ญท็้ๅไฝๅไธญ, ้ฒๅ ฅไฝๅ็้ ญ้จ. ็ถไธๅๅทฅไฝๅท่ก็ท็ไฝๅไธญๆซๆๆฒๆไปปๅๆ, ๅ ถๆ้จๆฉๅฐๅพๅ ถๅฎๅทฅไฝๅท่ก็ท็ไฝๅไนๅฐพ้จ็ฒๅไธๅไปปๅ.
ไฝฟ็จFork/Join
้้ๅฐฑ็จไธๅ็ฐกๅฎ็็ฏไพไพ็คบ็ฏๆ้บผไฝฟ็จFork/Join, ้ๆฑ็บ: ่จ็ฎ1+2+3+4+....+100็็ตๆ.
ไฝฟ็จFork/Joinๆกๆถ้ฆๅ ่ฆ่ๆ ฎๅฐ็ๆฏๅฆไฝๅๅฒไปปๅ, ่ฅๆๅๅธๆๆฏๅๅญไปปๅๆๅคๅท่กๅๅๆธๅญ็็ธๅ , ้ฃ้บผๆๅๅฏไปฅ่จญ็ฝฎthreshold็บ4, ็ฑๆผๆฏ100ๅๆธๅญ็ธๅ , ๆไปฅFork/Joinๆกๆถๆๆ้ๅไปปๅforkๆ25ๅๅญไปปๅ, ๅญไปปๅไธ่ฒ ่ฒฌ่จ็ฎ1+2+3+4, ๅญไปปๅไบ่ฒ ่ฒฌ5+6+7+8 ..., ไปฅๆญค้กๆจ, ๆๅพๅjoinๆๆๅญไปปๅ็็ตๆ.
ๅ ็บ้ๆฏๅๆ็ตๆ(ๅๅณๅผ)็ไปปๅ, ๆไปฅๅฟ ้ ็นผๆฟRecursiveTask, ๅฏฆไฝๅ งๅฎนๅฆไธ:
ๅท่ก็ตๆ:

็ฏไพ็จๅผ็ขผcommit็ด้้ปๆ.
้้้ๅ็ฏไพๆๅๅฏไปฅๅ็ๆดๆทฑไธ้ป, ้ๆผForkJoinTask, ๅ ถ่ไธ่ฌไปปๅไนไธป่ฆๅๅฅๅจๆผๅ ถ้่ฆๅฏฆไฝcomputeๆนๆณ, ๅจ้ๅๆนๆณไธญ, ้ฆๅ ้่ฆๅคๆทไปปๅๆฏๅฆ่ถณๅค ๅฐ, ่ฅๅค ๅฐๅฐฑ็ดๆฅๅท่กไปปๅ; ๅไนๅฐฑๅฟ ้ ้ฒ่กไปปๅๅๅฒ. ๆฏๅๅญไปปๅๅจๅผๅซforkๆนๆณๆ, ๅๆ้ฒๅ ฅcomputeๆนๆณ, ็็็ถๅ็ๅญไปปๅๆฏๅฆ้่ฆ็นผ็บๅพไธๅๅฒๆๆดๅค็ๅญไปปๅ, ่ฅไธ้่ฆ, ๅฐฑๅท่ก็ถๅๅญไปปๅไธฆไธๅๅณ็ตๆ. ไฝฟ็จjoinๆนๆณๅๆ็ญๅพ ๅญไปปๅๅท่กๅฎๆไธฆไธๅพๅฐๅ ถ็ตๆ.
Fork/Joinไธญ็Exception Handling
ForkJoinTaskๅจๅท่ก็ๆๅๅฏ่ฝๆๆๅบexception, ไฝๆฏๆๅๆฒ่พฆๆณๆผmain threadไธญ็ดๆฅcatch้ไบexception, ๆ
ForkJoinTaskๆไพไบisCompletedAbnormally()ๆนๆณไพๆชขๆฅไปปๅๆฏๅฆๅทฒ็ถๆๅบexceptionๆๆฏๅทฒ็ถ่ขซๅๆถไบ, ไธฆไธๅฏไปฅ้้ForkJoinTask็getException()ๆนๆณๅๅพexception. ไฝฟ็จไธๅคงๆฆ้ทๅพๅ้ๆจฃ(ๆทๅ่ชๅ้ข็็ฏไพ็จๅผ็ขผ):
getException()ๅๅณThrowable็ฉไปถ, ่ฅไปปๅ่ขซๅๆถไบๅๅๅณCancellationException. ่ฅไปปๅๆฒๆๅฎๆ่ฅ่ๆฒๆๆๅบexceptionๅๅๅณnull.
Fork/Join็ๅฏฆไฝๅ็
ForkJoinPool็ฑForkJoinTask้ฃๅ่ForkJoinWorkerThread้ฃๅ็ตๆ, ForkJoinTask้ฃๅ่ฒ ่ฒฌๅญๆพ็จๅผๆไบค็ตฆForkJoinPool็ไปป็ฉ, ่ForkJoinWorkerThread้ฃๅๅ่ฒ ่ฒฌๅท่ก้ไบไปปๅ.
1. ForkJoinTask็forkๆนๆณๅฏฆไฝๅ็:
็ถๆๅๅผๅซForkJoinTask็forkๆนๆณๆ, ็จๅผๆๅผๅซForkJoinWorkerThread็workQueue(ForkJoinPool.WorkQueue)็pushๆนๆณ้ๅๆญฅๅฐๅท่ก้ๅไปปๅ, ็ถๅพ็ซๅปๅๅณ็ตๆ, ๅๅง็ขผๅฆไธ:

็ฌฌ700่ก็pushๆนๆณๆ็ถๅ็ไปปๅๅญๆพๅจForkJoinTask้ฃๅqueue่ฃก, ็ถๅพๅๅผๅซForkJoinPool็signalWorkๆนๆณๅ้(active)ๆๅต้ ไธๅๅทฅไฝๅท่ก็ทไพๅท่กไปปๅ, ๅๅง็ขผๅฆไธ:

2. ForkJoinTask็joinๆนๆณๅฏฆไฝๅ็:
joinๆนๆณ็ไธป่ฆไฝ็จๆฏ้ปๅก(block)็ถๅๅท่ก็ทไธฆไธ็ญๅพ ็ฒๅพ็ตๆ, ๅ ถๅๅง็ขผๅฆไธ:

้ฆๅ , ๅ ถๅผๅซไบdoJoin(), ้้doJoin()ๅพๅฐ็ถๅไปปๅ็็ๆ ไพๅคๆทๅๅณไป้บผ็ตๆ, ไปปๅ็ๆ ๆๅ็จฎ: NORMAL(ๅทฒๅฎๆ), CANCELLED(่ขซๅๆถ), SIGNAL(ไฟก่)ไปฅๅEXCEPTIONAL(ๅบ็พ็ฐๅธธ), ๅฆไธๅ(้้ไธๆMASK็ถ็ๆ ไพ็ๅพ ):

่ฅไปปๅ็ๆ ๆฏNORMAL, ๅ็ดๆฅๅๅณไปปๅ็ตๆ.
่ฅไปปๅ็ๆ ๆฏCANCELLED, ๅ็ดๆฅๆๅบCancellationException.
่ฅไปปๅ็ๆ ๆฏEXCEPTIONAL, ๅ็ดๆฅๆๅบๅฐๆ็็ฐๅธธ.
ๆๅบ็ฐๅธธ็้จไปฝ(reportException)ๅฆไธๅ:

ๅไพ, ็ไธไธdoJoin็ๅๅง็ขผ:

ๅจdoJoinไธญ, ้ฆๅ ้้ๆฅ็ไปปๅ็็ๆ , ็ๆฏๅฆๅทฒ็ถๅท่กๅฎไบ(s < 0, negative means NORMAL), ่ฅๅท่กๅฎ็ข, ๅ็ดๆฅๅๅณไปปๅ็ๆ ; ๅไน, ๅๅพไปปๅ้ฃๅ่ฃกๅๅบไปปๅไธฆไธ้้doExec()ๅท่กไปปๅ, ๅ ถไธญ็exec()ๆ็ฑ็นผๆฟForkJoinTask็้กๅฅๅฏฆไฝ(ๆญค่็ฑRecursiveTaskๅฏฆไฝ). ่ฅไปปๅ้ ๅฉๅท่กๅฎไบ, ๅๆไปปๅ็ๆ ่จญๅฎ็บNORMAL; ๅไนๅ็ด้exception, ไธฆๆไปปๅ็ๆ ่จญ็บEXCEPTIONAL, doExec()ๅๅง็ขผๅฆไธ:

ๆๅพ, joinไธญ็getRawResultๆนๆณๅๆไบค็ฑ็นผๆฟForkJoinTask็้กๅฅๅฏฆไฝ(ๆญค่็บRecursiveTask), ็่ตทไพๅฐฑๅชๆฏๆ่จ็ฎๅฎ็็ตๆๅณๅๅป่ๅทฒ:

ๅ่่ณๆ
JDKๅๅง็ขผ(1.8.0_152)
Last updated