Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 599
Rollerball Avatar asked Jul 26 '13 12:07

Rollerball


People also ask

What is the difference between executor execute and executor submit in Java?

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.

What is execute () in Java?

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.)

How many threads are there in ForkJoinPool?

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 .

What is ForkJoinPool commonPool ()?

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 .


1 Answers

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 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.

like image 166
John Vint Avatar answered Sep 21 '22 18:09

John Vint