I have got the following class which runs and compiles (you can try it out). The only thing puzzles me a little is that at the end in the main it works fine with fj.invoke(task) but it does not with fj.execute(task) and fj.submit(task). I don't get any output with the latter ones. From the API it should be working with the other methods too they perform the task.. even if they either return or not a value they should still perform the task. What am I missing here?
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.ForkJoinPool;
public class RecursiveTaskActionThing extends RecursiveAction{
int roba;
static int counter;
public RecursiveTaskActionThing(int roba)
{
this.roba = roba;
}
public void compute()
{
if (roba<100)
{
System.out.println("The thing has been split as expected: "+ ++counter );
}
else{
roba = roba/2;
RecursiveTaskActionThing rc1 = new RecursiveTaskActionThing(roba);
RecursiveTaskActionThing rc2 = new RecursiveTaskActionThing(roba);
this.invokeAll(rc1,rc2);
}
}
public static void main (String []args)
{
ForkJoinPool fj = new ForkJoinPool();
fj.invoke(new RecursiveTaskActionThing(500));
}
}
You can try it out simply by copy and paste the code, by replacing
fj.invoke(new RecursiveTaskActionThing(500));
with
fj.execute(new RecursiveTaskActionThing(500));
or with
fj.submit(new RecursiveTaskActionThing(500));
it won't spit out any output... I am wondering why.
Thanks in advance.
1) The submit() can accept both Runnable and Callable tasks but execute() can only accept the Runnable task. 2) The submit() method is declared in the ExecutorService interface while the execute() method is declared in the Executor interface.
execute() is calling the execute method on an instance of an anonymous class; i.e. the object created by new SwingWorker<ImageIcon[], Object>(){...} . (It is a class that extends the SwingWorker class.)
Implementation notes: This implementation restricts the maximum number of running threads to 32767. Attempts to create pools with greater than the maximum number result in IllegalArgumentException .
ForkJoinPool#commonPool() is a static thread-pool, which is lazily initialized when is actually needed. Two major concepts use the commonPool inside JDK: CompletableFuture and Parallel Streams .
Based on your last question, it would really be beneficial to you to learn how to read other code for specific questions like this.
But anyway. invoke
will execute and join on that task. execute
and submit
will push the task to a work queue to be worked on later. If you want to see the expected output call the join
method of the task after submit
ing or execute
ing.
Now that final question should be, 'Why won't the task run at all?' The threads are created as setDaemon(true)
, and so when you leave your main
method you main Thread dies. And as the spec specifies when only daemon threads are running the system will exit.
By joining on the task, you are suspending the main thread until the fork join tasks complete.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With