2016-11-09 4 views
-3
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"を実行すると、このエラーが発生します。どうすれば修正できますか?

java.lang.RuntimeExceptionスレッドの例外 "メイン":数N でFibonacci.main(Fibonacci.java:16)

はどのようにこの問題を解決する方法を教えてください。 このプログラムは、次のように動作すると想定しています。コマンドラインで、ユーザーがプログラムが生成するフィボナッチ数の数を入力します。このプログラムは、フィボナッチ数を生成する別のスレッドを作成し、スレッドが共有できるデータにシーケンスを配置します(おそらく配列は最も便利なデータ構造です)。

+0

あなたは 'Javaのフィボナッチ'そうでない場合、あなたが意志とあなたのプログラムを起動していることを確認してくださいを生成することであることをフィボナッチ数の整数である必要があり、次のコマンドを使用します。あなたのプログラムは1つの引数を除いてこの例外を受け取ります –

+0

どのようにプログラムを実行しますか?あなたは '' RuntimeException( "number n");を投げると思いますか? – talex

+0

サンプルコードを[mcve]に減らしてください。最小限のコードは、タイミングが特にその側面に関する質問でない限り、通常はタイミングルーチンを含むべきではありません。 –

答えて

0

標準入力ストリームから読み込むには、System.inストリームから読み込みます。文字列配列は、メインのメソッドに渡すコマンドラインの引数ではなく、ユーザーの入力データです。

1

プログラムを実行しているときは、コマンドに引数を指定する必要があります。 「n」は、プログラムが

Javaのフィボナッチのn

関連する問題