Listing6-9 presentsa MatMult classthatextends RecursiveAction .Toaccom-
plish meaningful work, RecursiveAction 's void compute() method is over-
Note Although compute() isnormallyusedtosubdivideataskintosubtasksre-
ity and simplicity).
c andinstantiates ForkJoinPool .Ittheninstantiates MatMult ,passingthesethree
Matrix instancesasargumentstothe MatMult(Matrix a, Matrix b, Mat-
rix c) constructor,andcalls ForkJoinPool 's T invoke(ForkJoinTask<T>
task) method to start running this initial task. This method does not return until the
initial task and all of its subtasks complete.
The MatMult(Matrix a, Matrix b, Matrix c) constructorinvokesthe
MatMult(Matrix a, Matrix b, Matrix c, int row) constructor,spe-
cifying -1 as row 's value. This value is used by compute() , which is invoked as a
resultoftheaforementioned invoke() methodcall,todistinguishbetweentheinitial
task and subtasks.
When compute() is initially called ( row equals -1 ), it creates a List of
MatMult tasks and passes this List to RecursiveAction 's Collection<T>
invokeAll(Collection<T> tasks) method (inherited from
ForkJoinTask ).This method forksall the List collection's tasks, which will start
to execute. It then waits until the invokeAll() method returns (which also joins to
allthesetasks),whichhappenswhenthe boolean isDone() method(alsoinherited
from ForkJoinTask ) returns true for each task.
Noticethe tasks.add(new MatMult(a, b, c, row)); methodcall.This
call assigns a specific row value to a MatMult instance. When invokeAll() is
called, each task's compute() method is called and detects a different value (other
than -1) assigned to row . It then executes multiplyRowByColumn(a, b, c,
row); for its specific row .
When you run this application ( java MatMult ), it generates the following output:
1.0 2.0 3.0
4.0 5.0 6.0