2013-07-26 8 views
6

Ho la seguente classe che gira e compila (puoi provarlo). L'unica cosa che mi lascia un po 'perplesso è che alla fine nel main funziona bene con fj.invoke (task) ma non con fj.execute (task) e fj.submit (task). Non ottengo alcun output con questi ultimi. Dall'API dovrebbe funzionare anche con gli altri metodi che eseguono l'operazione .. anche se restituiscono o meno un valore, devono comunque eseguire l'attività. Cosa mi manca qui?Differenza tra Execute, Submit e Invoke() in un 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)); 
} 
} 

Si può provare semplicemente copia e incolla il codice, sostituendo

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

fj.execute(new RecursiveTaskActionThing(500)); o con

fj.submit(new RecursiveTaskActionThing(500)); non sarà sputare qualsiasi uscita .. Mi sto chiedendo perché.

Grazie in anticipo.

risposta

7

Sulla base dell'ultima domanda, sarebbe davvero utile per voi imparare come leggere altro codice per domande specifiche come questa.

Ma comunque. invoke verrà eseguito e partecipare a tale attività. execute e submit invieranno l'attività a una coda di lavoro su cui lavorare in seguito. Se si desidera vedere l'uscita prevista chiamare il metodo join dell'attività dopo submit ing o execute ing.

Ora la domanda finale dovrebbe essere: "Perché il compito non verrà eseguito affatto?" I thread sono creati come setDaemon(true), quindi, quando si abbandona il metodo main, il thread principale muore. E siccome la specifica specifica quando sono in esecuzione solo i thread daemon, il sistema uscirà.

Unendosi all'attività, si sospende il thread principale fino al completamento delle attività di fork join.

+0

Grande, grazie mille, solo una curiosità lavori con questa roba su base regolare o sei solo appassionato? – Rollerball

+0

Intendo con il regno del multithreading – Rollerball

+0

@Rollerball solo appassionato :) –