Mam następujące klasy, która uruchamia i kompiluje (można go wypróbować). Jedyne, co mnie trochę zastanawia, to to, że na końcu działa dobrze z fj.invoke (task), ale nie działa z fj.execute (task) i fj.submit (task). Nie mam żadnego wyjścia z tymi ostatnimi. Z API powinno działać również z innymi metodami, które wykonują zadanie. Nawet jeśli zwracają lub nie mają wartości, powinny nadal wykonywać zadanie. Czego mi tu brakuje?Różnica między Execute, Submit i Invoke() w ForkJoinPool
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));
}
}
Można go wypróbować, wystarczy skopiować i wkleić kod, zastępując
fj.invoke(new RecursiveTaskActionThing(500));
z
fj.execute(new RecursiveTaskActionThing(500));
lub
fj.submit(new RecursiveTaskActionThing(500));
nie będzie wypluć żadnego wyjścia .. Zastanawiam się dlaczego.
Z góry dziękuję.
Świetnie, wielkie dzięki, tylko ciekawość, czy regularnie zajmujesz się tymi rzeczami, czy jesteś po prostu namiętna? – Rollerball
Mam na myśli dziedzinę wielowątkowości – Rollerball
@Rollerball po prostu namiętny :) –