我运行以下代码“线程中的异常”主“java.lang.RuntimeException”后,我收到此错误。我该如何解决?

时间:2016-11-09 12:47:54

标签: java multithreading fibonacci

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数字,将序列放在可由线程共享的数据中(数组可能是最方便的数据结构)。

2 个答案:

答案 0 :(得分:1)

运行程序时,应在命令中提供参数。使用以下命令,其中“n”应该是程序要生成的Fibonacci数的整数

java Fibonacci n

答案 1 :(得分:0)

要从标准输入流中读取,请从System.in流中读取。传递给main方法的字符串数组是命令行参数,而不是用户输入数据。