ForkJoinPool中执行,提交和调用()之间的区别
问题描述:
我有以下类,它运行并编译(可以试试)。唯一令我感到困惑的是,在主结束时,它可以很好地与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));
..我想知道为什么。
在此先感谢。
答
根据你的最后一个问题,你将学习如何阅读其他代码来解决这个问题。
但无论如何。 invoke
将执行并加入该任务。 execute
和submit
会将任务推送到稍后处理的工作队列中。如果您想查看预期的输出,请在submit
ing或execute
ing之后调用join
方法。
现在最后一个问题应该是'为什么不能完成任务?'线程创建为setDaemon(true)
,因此当您离开main
方法时,主线程将死亡。并且由于规范指定只有守护程序线程正在运行,系统将退出。
通过加入该任务,您将挂起主线程,直到fork连接任务完成。
很好,非常感谢,只是一个好奇心,你经常与这些东西工作,或者你只是充满激情? – Rollerball
我的意思是多线程领域 – Rollerball
@Rollerball只是热情:) –