2013-07-26 60 views
6

私は以下のクラスを実行してコンパイルしています(あなたが試してみることができます)。私が少し困惑するのは、メインの最後ではfj.invoke(タスク)でうまく動作しますが、fj.execute(タスク)とfj.submit(タスク)では機能しません。私は後者のものでは何の出力も得られません。 APIからは、他のメソッドと一緒に作業する必要があります。タスクを実行する必要がある場合でも、値を返すかどうかに関係なく、タスクを実行します。 私はここで何が欠けていますか?ForkJoinPoolのExecute、Submit、Invoke()の違い

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.execute(new RecursiveTaskActionThing(500));またはそれは任意の出力を吐き出すません

fj.submit(new RecursiveTaskActionThing(500));

fj.invoke(new RecursiveTaskActionThing(500));を交換することにより、コードを貼り付けます。..なぜ私は不思議に思っています。

ありがとうございます。

答えて

7

あなたの最後の質問に基づいて、このような特定の質問のための他のコードを読む方法を学ぶことは本当に有益でしょう。

しかし、とにかく。 invokeが実行され、そのタスクに参加します。 executeおよびsubmitは、後で作業する作業キューにタスクをプッシュします。期待される出力を確認したい場合は、submitまたはexecute ingの後にタスクのjoinメソッドを呼び出します。

最終的な質問は「なぜタスクはまったく実行されないのですか?スレッドはとして作成されますので、mainメソッドを終了すると、メインスレッドが終了します。スペックはデーモンスレッドのみが実行されているときに指定するので、システムは終了します。

タスクに参加することで、フォーク結合タスクが完了するまでメインスレッドを一時停止します。

+0

大変感謝しています。ただの好奇心で、定期的にこのようなことをしていますか、それともあなたは情熱的ですか? – Rollerball

+0

私はマルチスレッドの領域を意味します – Rollerball

+0

@Rollerballただ情熱:) –

関連する問題