14

我有以下运行和编译的类(你可以试试看)。唯一让我有点困惑的是,最后它与 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));它不会吐出任何输出......我想知道为什么。

提前致谢。

4

1 回答 1

20

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

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

现在最后一个问题应该是,“为什么任务根本不运行?” 线程被创建为setDaemon(true),所以当你离开你的main方法时,你的主线程会死掉。正如规范所指定的,只有守护线程正在运行时,系统将退出。

通过加入任务,您将暂停主线程,直到分叉连接任务完成。

于 2013-07-26T12:56:15.017 回答