2013-07-26 127 views
6

我有以下类,它运行并编译(可以试试)。唯一令我感到困惑的是,在主结束时,它可以很好地与fj.invoke(task)协同工作,但不会与fj.execute(task)和fj.submit(task)一起工作。后者不会得到任何输出。 从API它应该与其他方法一起工作,即使它们要么返回值,要么仍然执行任务。 我在这里错过了什么?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)); 
} 
} 

您可以通过简单的复制尝试,并粘贴代码,用

fj.execute(new RecursiveTaskActionThing(500));

fj.submit(new RecursiveTaskActionThing(500));也不会吐出来的任何输出更换

fj.invoke(new RecursiveTaskActionThing(500)); ..我想知道为什么。

在此先感谢。

回答

7

根据你的最后一个问题,你将学习如何阅读其他代码来解决这个问题。

但无论如何。 invoke将执行并加入该任务。 executesubmit会将任务推送到稍后处理的工作队列中。如果您想查看预期的输出,请在submit ing或execute ing之后调用join方法。

现在最后一个问题应该是'为什么不能完成任务?'线程创建为setDaemon(true),因此当您离开main方法时,主线程将死亡。并且由于规范指定只有守护程序线程正在运行,系统将退出。

通过加入该任务,您将挂起主线程,直到fork连接任务完成。

+0

很好,非常感谢,只是一个好奇心,你经常与这些东西工作,或者你只是充满激情? – Rollerball

+0

我的意思是多线程领域 – Rollerball

+0

@Rollerball只是热情:) –