2013-07-26 8 views
6

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

Odpowiedz

7

W oparciu o twoje ostatnie pytanie, naprawdę warto byłoby nauczyć się czytać inny kod dla konkretnych pytań, takich jak ten.

Ale tak. invoke wykona i dołączy do tego zadania. execute i submit spowoduje przeniesienie zadania do kolejki roboczej, z której będzie można pracować później. Jeśli chcesz zobaczyć oczekiwane wyjście, wywołaj metodę join zadania po submit lub execute.

Teraz, ostatnie pytanie powinno brzmieć: "Dlaczego zadanie nie zostanie wykonane?" Wątki są tworzone jako setDaemon(true), a więc po opuszczeniu metody main główny wątek umiera. A ponieważ specyfikacja określa, kiedy działają tylko wątki demona, system zakończy działanie.

Przystępując do tego zadania, zawieszasz wątek główny, dopóki zadania łączenia widełek nie zostaną ukończone.

+0

Świetnie, wielkie dzięki, tylko ciekawość, czy regularnie zajmujesz się tymi rzeczami, czy jesteś po prostu namiętna? – Rollerball

+0

Mam na myśli dziedzinę wielowątkowości – Rollerball

+0

@Rollerball po prostu namiętny :) –

Powiązane problemy