首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java RecursiveTask叉和计算

Java RecursiveTask叉和计算
EN

Stack Overflow用户
提问于 2018-01-29 22:20:00
回答 2查看 1.3K关注 0票数 0

我有使用RecursiveTask的febunacci算法代码,我在

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html

代码1

代码语言:javascript
复制
public class Fibonacci extends RecursiveTask<Integer> {
   final int n;
   public Fibonacci (int n) { this.n = n; }
   public Integer compute() {
     if (n <= 1)
        return n;
     Fibonacci  f1 = new Fibonacci(n - 1);
     f1.fork();
     Fibonacci  f2 = new Fibonacci(n - 2);
 return f2.compute() + f1.join();

   }
   public static void main(String args[]){
       ForkJoinPool fjpool = new ForkJoinPool();

        RecursiveTask task = new Fibonacci(30);
        long startTime1=System.currentTimeMillis();;
        Integer O=(Integer) fjpool.invoke(task);
        long endTime1 =  System.currentTimeMillis();
        long duration1 = (endTime1 - startTime1);
        System.out.println(duration1);

   }}

这段代码在83ms中执行,我修改了它。

代码2

代码语言:javascript
复制
public class Fibonacci extends RecursiveTask<Integer> {
   final int n;
   public Fibonacci (int n) { this.n = n; }
   public Integer compute() {
     if (n <= 1)
        return n;
     Fibonacci  f1 = new Fibonacci(n - 1);

     Fibonacci  f2 = new Fibonacci(n - 2);
 return f2.compute() + f1.compute();

   }
   public static void main(String args[]){
       ForkJoinPool fjpool = new ForkJoinPool();

        RecursiveTask task = new Fibonacci(30);
        long startTime1=System.currentTimeMillis();;
        Integer O=(Integer) fjpool.invoke(task);
        long endTime1 =  System.currentTimeMillis();
        long duration1 = (endTime1 - startTime1);
        System.out.println(duration1);

   }}

现在,在20 me中执行的这段代码可以有人解释为什么第二步速度更快,我阅读了文档,它说叉异步执行,然后运行慢于使用计算。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-29 22:30:46

第一种解决方案可能执行得很差,因为最小的子任务太小,不值得拆分。

RecursiveTask task = new Fibonacci(30);

相反,就像几乎所有的叉/连接应用程序的情况一样,您可以选择一些最小粒度大小(例如这里的30 ),对于这些粒度大小,您总是顺序地解决而不是细分。

记住,当涉及到要并行化的更大的数据集时,Fork/Join框架是巨大的。

来源

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html

票数 0
EN

Stack Overflow用户

发布于 2021-01-13 09:22:51

因为+compute()不使用池中的新线程,并且它不是在池托管线程中运行的。当池调用了许多RecursiveTasks时,您将看到+join()的并行性好处。然后,如果计算方法中存在等待或阻塞,则它的线程将被其他任务使用。所以会有更少的线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48510959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档