import java.util.Scanner;
public class fibThread {
@SuppressWarnings("resource")
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner fib = new Scanner(System.in);
System.out.print("Enter the Length of the Fibonacci Series :");
int num = fib.nextInt();
Runnable r = new Fib("Result", num);
new Thread(r).start();
try{
Thread.sleep(10000);
}
catch (InterruptedException e) {
System.out.println("Thread interrupted.");
}
int[] result =((Fib) r).getResult();
System.out.print("The Fibonacci Series is :" + result);
}
}
class Fib implements Runnable{
private int num;
int f0=0, f1=1,fn=0;
int arr[] = new int[num];
public Fib(String string, int num) {
// TODO Auto-generated constructor stub
this.num = num;
}
@Override
public void run() {
for(int i=0; i<num; i++){
fn = f0 + f1;
f0 = f1;
f1 = fn;
arr[i] = fn;
}
}
public int[] getResult(){
return arr;
}
}
给了我一个问题,我写了上面的代码
编写一个生成fibonacci序列的多线程程序。该计划应如下工作: 在命令行中,用户将输入程序要生成的斐波纳契数。然后程序将创建一个单独的线程,该线程将生成斐波那契数字,将序列放在可由线程共享的数据中(数组可能是最方便的数据结构)。当线程完成执行时,父线程将输出子线程生成的序列。
请帮我解决....
答案 0 :(得分:1)
您收到ArrayIndexOutOfBoundsException
因为num
在宣布0
时被初始化为arr
。
int num; // <-- 0
int arr[] = new int[num]; // <-- int[0]
public Fib(String string, int num) {
// TODO Auto-generated constructor stub
this.num = num;
}
您可以将数组声明移动到构造函数中,如
int num;
int arr[];
public Fib(String string, int num) {
this.num = num;
this.arr = new int[num];
}
您需要分享arr
。我认为你应该使用static
字段,并进行同步。使用Binet's formula生成斐波纳契数列通常更容易。您的任务似乎是创建一个多线程Iterative Memoized version。