java - 在 Java 中用线程计算斐波那契数列

标签 java multithreading fibonacci

import java.math.BigInteger;
import java.util.concurrent.*;

public class MultiThreadedFib {

private ExecutorService executorService;

public MultiThreadedFib(final int numberOfThreads) {
  executorService = Executors.newFixedThreadPool(numberOfThreads);
}

public BigInteger getFibNumberAtIndex(final int index) 
  throws InterruptedException, ExecutionException {

  Future<BigInteger> indexMinusOne = executorService.submit(
    new Callable<BigInteger>() {
      public BigInteger call() 
      throws InterruptedException, ExecutionException {
        return getNumber(index - 1);
      }
  });

  Future<BigInteger> indexMinusTwo = executorService.submit(
    new Callable<BigInteger>() {
      public BigInteger call() 
      throws InterruptedException, ExecutionException {
        return getNumber(index - 2);
      }
  });

  return indexMinusOne.get().add(indexMinusTwo.get());
}

public BigInteger getNumber(final int index) 
throws InterruptedException, ExecutionException {
  if (index == 0 || index == 1)
    return BigInteger.valueOf(index);

  return getFibNumberAtIndex(index - 1).add(getFibNumberAtIndex(index - 2));
  }
}

我打算用 Java 线程计算斐波那契数列以减少计算时间,但答案是错误的,尽管它似乎是真的。 另一个问题是在为顶部的 35 号线程启动新线程时发生内存不足异常。 请帮我 多多问候...

最佳答案

你说你这样做是为了提高性能。有几个问题:

  • 在此使用线程永远不会减少计算时间 方式。
  • 如果你关心性能,递归不是一个好主意 这个问题。

只要有一个线程、一个简单的循环和两个变量,您将拥有在性能方面难以超越的东西(即不使用 a closed-form solution )。

关于java - 在 Java 中用线程计算斐波那契数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7673320/

相关文章:

java - 请求参数不存在

java - 字符串数组长度显示为 1,即使调用逗号 (,) 分隔后数组为空

java - 消费者和 worker 模式

java - 如何获得斐波那契递归的时间

java - Java 中的 NoClassDefFoundError : com/google/common/base/Function

java - 如何在自定义注释中进行 Rest API 调用?

multithreading - 哪种方法更好?允许线程休眠一段时间或删除它并稍后重新创建它?

java - 如何使用当前线程来处理一个工作队列?

fibonacci - 在 APL 中生成没有循环或流量控制的斐波那契数列

algorithm - 使用矩阵找出将 n 写为 1、3 和 4 之和的不同方式的数量?