Fork/Joinuses work stealing tominimizethreadcontentionandoverhead.Eachwork-
er thread from a pool of worker threads has its own double-ended work queue and
is empty, the worker thread tries to get a task from the tail of another queue. Stealing
is infrequent because worker threads put tasks into their queues in a last-in, first-out
problems. You start by giving the tasks to a central worker and it keeps dividing them
Fork/Join largely consists of the java.util.concurrent package's
ForkJoinPool , ForkJoinTask , ForkJoinWorkerThread , RecursiveAc-
tion , and RecursiveTask classes:
• ForkJoinPool is an ExecutorService implementation for running
ForkJoinTask s. A ForkJoinPool instance provides the entry point for
submissionsfromnon- ForkJoinTask clients,aswellasprovidingmanage-
ment and monitoring operations.
• ForkJoinTask is the abstract base class for tasks that run within a
ForkJoinPool context. A ForkJoinTask instance isathread-like entity
that is much lighter weight than a normal thread. Huge numbers of tasks
and subtasks may be hosted by a small number of actual threads in a
ForkJoinPool , at the price of some usage limitations.
• ForkJoinWorkerThread describes a thread managed by a
ForkJoinPool instance, which executes ForkJoinTask s.
• RecursiveAction describes a recursive resultless ForkJoinTask .
• RecursiveTask describes a recursive result-bearing ForkJoinTask .
The Java documentation provides examples of RecursiveAction -based tasks
(such as sorting) and RecursiveTask -based tasks (such as computing Fibonacci
numbers).Youcanalsouse RecursiveAction toaccomplishmatrixmultiplication
matrix consisting of a specific number of rows and columns.
Listing 6-7. A class for representing a two-dimensional table
private double matrix;