import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Fibonacci {
private static long[] value;
public static void main(String args[]) throws InterruptedException {
int n;
try {
n = Integer.parseInt(args[0]);
} catch (Exception e) {
throw new RuntimeException(" number n");
}
value = new long[n + 1];
long start = System.nanoTime();
System.out.print("Dynamic Programming = " + fibon(n));
long end = System.nanoTime();
System.out.println("\t time = " + (end - start) + "ns");
start = System.nanoTime();
System.out.print("Sequence = " + Sequence(n));
end = System.nanoTime();
System.out.println("\t time = " + (end - start) + "ns");
start = System.nanoTime();
//int nThreads = Runtime.getRuntime().availableProcessors();
int nThreads = 30;
ExecutorService executorService = Executors
.newFixedThreadPool(nThreads);
int result;
try {
result = fibonacciSum(n, executorService); }
catch (ExecutionException e) {
throw new RuntimeException("Thread Interuppted "); }
System.out.print(" MultiThreading = " + result);
end = System.nanoTime();
System.out.println("\t time = " + (end - start) + "ns");
}
public static long fibon(int n) {
value[0] = 1;
value[1] = 1;
if (n <= 2)
return 1;
else if (value[n - 1] != 0)
return value[n];
for (int j = 2; j <= n; j++) {
value[j] = fibon(j - 2) + fibon(j - 1); }
return value[n];
}
public static long Sequence(int n) {
if (n <= 2)
return 1;
else
return (Sequence(n - 1) + Sequence(n - 2));
}
private static class FibonacciThread implements Runnable {
int index;
int result;
ExecutorService executorService;
public FibonacciThread(int index) {
this.index = index;
}
public void run() {
try {
this.result = fibonacciSum(index, executorService);
} catch (Exception e) {
throw new RuntimeException("Thread interupted");
}
}
}
private static int fibonacciSum(int index, ExecutorService executorService)
throws InterruptedException, ExecutionException {
if (index == 1 || index == 2) {
return 1;
} else {
FibonacciThread fibonacciThread1 = new FibonacciThread(index - 2);
fibonacciThread1.executorService=executorService;
Future future = executorService.submit(fibonacciThread1);
Object object = future.get();
int resultPart2 = fibonacciSum(index - 1, executorService);
int result = fibonacciThread1.result + resultPart2;
//executorService.shutdown();
return result;
}
}
}
运行上面的代码后,我收到此错误。
线程“main”中的异常java.lang.RuntimeException:Number n at Fibonacci.main(Fibonacci.java:16)
请告诉我如何解决这个问题。 该程序假设按如下方式工作:在命令行中,用户将输入程序要生成的Fibonacci数。然后程序将创建一个单独的线程,该线程将生成Fibonacci数字,将序列放在可由线程共享的数据中(数组可能是最方便的数据结构)。
答案 0 :(得分:1)
运行程序时,应在命令中提供参数。使用以下命令,其中“n”应该是程序要生成的Fibonacci数的整数
java Fibonacci n
答案 1 :(得分:0)
要从标准输入流中读取,请从System.in流中读取。传递给main方法的字符串数组是命令行参数,而不是用户输入数据。