Разница между 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
метод задачи после submit
ing или execute
ing.
теперь последний вопрос должен быть: "почему задача вообще не выполняется?' Потоки создаются как setDaemon(true)
и так, когда вы покидаете свой main
метод основной поток умирает. И поскольку спецификация указывает, когда только потоки демона работают, система выйдет.
присоединившись к задаче, вы приостанавливаете основной поток до завершения задач соединения вилки.