我有以下运行和编译的类(你可以尝试一下)。唯一令我困惑的是,在主要结尾它与fj.invoke(任务)一起工作正常,但它没有fj.execute(task)和fj.submit(task)。我没有得到后者的任何输出。 从API开始,它也应该与其他方法一起执行任务..即使它们返回或不返回值,它们仍然应该执行任务。 我在这里缺少什么?
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.invoke(new RecursiveTaskActionThing(500));
fj.execute(new RecursiveTaskActionThing(500));
或
fj.submit(new RecursiveTaskActionThing(500));
它不会吐出任何输出......我想知道为什么。
提前致谢。
答案 0 :(得分:15)
根据您的上一个问题,了解如何阅读此类特定问题的其他代码对您来说真的很有用。
但无论如何。 invoke
将执行并加入该任务。 execute
和submit
会将任务推送到工作队列以便稍后处理。如果要查看预期输出,请在join
或submit
之后调用任务的execute
方法。
现在最后一个问题应该是'为什么这个任务根本不会运行?'线程创建为setDaemon(true)
,因此当您离开main
方法时,主线程将死亡。并且由于规范指定何时只有守护程序线程正在运行,系统将退出。
通过加入任务,您将挂起主线程,直到fork join任务完成。