Разница между Execute, Submit и Invoke() в ForkJoinPool

у меня есть следующий класс, который работает и компилирует (вы можете попробовать). Единственное, что меня немного озадачивает, это то, что в конце в основном он отлично работает с fj.вызов (задача), но не с fj.выполнить (задача) и fj.отправить (задание). Я не получаю никакого результата от последних. Из API он должен работать с другими методами, которые также выполняют задачу.. даже если они возвращают или не возвращают значение, они все равно должны выполнить задачу. Что я упускаю здесь?

    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));
}
}

вы можете попробовать его просто скопировать и вставить код, заменив

fj.invoke(new RecursiveTaskActionThing(500)); С

fj.execute(new RecursiveTaskActionThing(500)); или

fj.submit(new RecursiveTaskActionThing(500)); он не будет выплевывать какой-либо выход... Интересно, почему?

спасибо заранее.

1 ответов


основываясь на вашем последнем вопросе, было бы действительно полезно узнать, как читать другой код для конкретных вопросов, подобных этому.

но в любом случае. invoke выполнит и присоединится к этой задаче. execute и submit переместит задачу в рабочую очередь, над которой будет работать позже. Если вы хотите увидеть ожидаемый результат вызов join метод задачи после submiting или executeing.

теперь последний вопрос должен быть: "почему задача вообще не выполняется?' Потоки создаются как setDaemon(true) и так, когда вы покидаете свой main метод основной поток умирает. И поскольку спецификация указывает, когда только потоки демона работают, система выйдет.

присоединившись к задаче, вы приостанавливаете основной поток до завершения задач соединения вилки.