2016-11-09 5 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; 
     } 
    } 
} 

위의 코드를 실행 한 후에이 오류가 발생합니다. 스레드에서다음 코드 "예외 스레드"주 "java.lang.RuntimeException"을 실행 한 후에이 오류가 발생합니다. 어떻게 해결할 수 있습니까?

예외 "주요"java.lang.RuntimeException가 : Fibonacci.main (Fibonacci.java:16)의 수 n

방법이 문제를 해결하는 방법을 가르쳐주세요. 이 프로그램은 다음과 같이 동작합니다 : 명령 줄에서 사용자가 프로그램이 생성 할 피보나치 숫자의 수를 입력합니다. 그러면 프로그램은 피보나치 숫자를 생성 할 별도의 스레드를 생성하여 스레드가 공유 할 수있는 데이터에 시퀀스를 배치합니다 (배열은 아마도 가장 편리한 데이터 구조입니다).

+0

당신은'자바 피보나치 '그렇지 않으면 당신은 의지와 프로그램을 실행했는지 확인을 생성하는 것입니다 피보나치 수의 정수이어야합니다 다음 명령을 사용하여 프로그램이 하나의 인수를 제외하고이 예외가 발생합니다 –

+0

어떻게 프로그램을 실행합니까? BTW 당신은''RuntimeException ("number n");을 던질 것이라고 생각합니까? – talex

+0

예제 코드를 [mcve]로 줄이십시오. 최소의 코드는 타이밍 루틴을 포함하지 않아야한다. –

답변

0

표준 입력 스트림에서 읽으려면 System.in 스트림에서 읽습니다. 문자열 배열은 사용자 입력 데이터가 아닌 명령 행 인수 인 기본 메소드로 전달됩니다.

1

프로그램을 실행할 때 명령에 인수를 제공해야합니다. "N"프로그램이

자바 피보나치 N