写在前面
只是简单通过递归实现斐波那契来学习多线程,dp可做到o(n)
递归实现斐波那契的流程
递归实现
public static int recursion(int cnt) {
if (cnt <= 0) return 0;
if (cnt <= 2) return 1;
return recursion(cnt - 1) + recursion(cnt - 2);
}
多线程的实现
实现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会将异常吞掉。
详细可见博文: