线程-多线程实现斐波那契

266 阅读1分钟

写在前面

只是简单通过递归实现斐波那契来学习多线程,dp可做到o(n)

递归实现斐波那契的流程

image.png 递归实现

public static int recursion(int cnt) {
    if (cnt <= 0) return 0;
    if (cnt <= 2) return 1;
    return recursion(cnt - 1) + recursion(cnt - 2);
}

多线程的实现

image.png

实现Callable接口

static class FibonacciTask implements Callable<Integer> {
    int count = 0;

    public FibonacciTask(int n) {
        count = n;
    }


    @Override
    public Integer call() throws Exception {
        if (count <= 0) return 0;
        if (count <= 2) return 1;
        FibonacciTask fibonacciTask1 = new FibonacciTask(count - 1);
        FibonacciTask fibonacciTask2 = new FibonacciTask(count - 2);
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        Future<Integer> submit1 = executorService.submit(fibonacciTask1);
        Future<Integer> submit2 = executorService.submit(fibonacciTask2);
        executorService.shutdown();
        return submit1.get() + submit2.get();

    }
}

启动入口

public static void main(String[] args) throws ExecutionException, InterruptedException {
    int n = 50;
    // 多线程实现
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    Future<Integer> submit = executorService.submit(new FibonacciTask(n - 1));
    Future<Integer> submit1 = executorService.submit(new FibonacciTask(n - 2));
    System.out.println(submit1.get() + submit.get());
    executorService.shutdown();

}

到这里有可能会程序卡住不动,是因为递归次数过多导致堆栈溢出,但是为什么没有报错信息,是因为FutureTask会将异常吞掉。

详细可见博文:

blog.csdn.net/u014240299/…