我有下面的类可以运行和编译(您可以尝试一下)。唯一让我感到困惑的是,最后,它在fj.invoke(task)中可以正常工作,但在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));它不会吐出任何输出...我想知道为什么。

提前致谢。

最佳答案

根据您的最后一个问题,学习如何阅读诸如此类的特定问题的其他代码对您真的很有益。

但无论如何。 invoke将执行并加入该任务。 executesubmit将把任务推送到工作队列中,以便以后处理。如果要查看预期的输出,请在joinsubmit ing之后调用任务的execute方法。

现在最后一个问题应该是,“为什么任务根本不运行?”线程创建为setDaemon(true),因此,当您离开main方法时,主线程就会死亡。并且正如规范指定的那样,仅当守护程序线程在运行时,系统将退出。

通过加入任务,您将挂起主线程,直到派生加入任务完成。

09-20 21:07