Search code examples
javamethodsconcurrencyfork-join

Difference between Execute , Submit and Invoke() in a ForkJoinPool


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.


Solution

  • 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 submiting or executeing.

    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.


    Based on your last question, it would really be beneficial to you to learn how to read other code for specific questions like this.