2013-07-26 4 views
6

Ich habe die folgende Klasse, die läuft und kompiliert (Sie können es ausprobieren). Das einzige, was mich etwas verwirrt, ist, dass es am Ende im großen und ganzen mit fj.invoke (Aufgabe) funktioniert, aber nicht mit fj.execute (task) und fj.submit (task). Ich bekomme mit den letzteren keine Ausgabe. Von der API sollte es auch mit den anderen Methoden arbeiten, sie führen die Aufgabe aus. Selbst wenn sie entweder einen Wert zurückgeben oder nicht, sollten sie die Aufgabe noch ausführen. Was fehlt mir hier?Unterschied zwischen Execute, Submit und Invoke() in einem 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)); 
} 
} 

Sie können es einfach kopieren ausprobieren und fügen Sie den Code, durch

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

fj.execute(new RecursiveTaskActionThing(500)); oder mit

fj.submit(new RecursiveTaskActionThing(500)); ersetzt ausspucken es wird keine Ausgabe .. Ich frage mich warum.

Vielen Dank im Voraus.

Antwort

7

Basierend auf Ihrer letzten Frage wäre es für Sie wirklich von Vorteil, zu erfahren, wie Sie anderen Code für bestimmte Fragen wie diesen lesen können.

Aber trotzdem. invoke wird ausgeführt und beitreten dieser Aufgabe. execute und submit verschieben die Aufgabe in eine Arbeitswarteschlange, an der später gearbeitet werden soll. Wenn Sie die erwartete Ausgabe sehen möchten, rufen Sie die join Methode der Aufgabe nach submit ing oder execute ing.

Jetzt sollte diese letzte Frage lauten: "Warum wird die Aufgabe überhaupt nicht ausgeführt?" Die Threads werden als setDaemon(true) erstellt, und wenn Sie Ihre main Methode verlassen, stirbt Ihr Haupt-Thread. Und wie die Spezifikation angibt, wenn nur Daemon-Threads ausgeführt werden, wird das System beendet.

Wenn Sie an der Aufgabe teilnehmen, unterbrechen Sie den Hauptthread, bis die Aufgaben der Verzweigung abgeschlossen sind.

+0

Toll, vielen Dank, nur eine Neugier arbeitest du regelmäßig mit diesem Zeug oder bist du nur leidenschaftlich? – Rollerball

+0

Ich meine mit dem Multithreading-Realm – Rollerball

+0

@Rollerball nur leidenschaftlich :) –

Verwandte Themen