2010-12-05 2 views
1

다음 code 피보나치 수 문제를 병렬 처리하려고 시도합니다. 스레드의 수가 제한되도록 어떻게 수정 할 수 있습니까?피보나치 스레드를 사용하여

나는 피보나치가 자연 스레 쓰레딩을 할 수 없다는 것을 알고 있습니다. 그러나 스레딩을 통해 어떻게 최적화 될 수 있는지 알고 싶습니다.

public class Fib extends Thread 
{ 
    private int x; 
    public int answer; 

    public Fib(int x) { 
     this.x = x; 
    } 

    public void run() { 
     if(x <= 2) 
      answer = 1; 
     else { 
      try { 
       Fib f1 = new Fib(x-1); 
       Fib f2 = new Fib(x-2); 
       f1.start(); 
       f2.start(); 
       f1.join(); 
       f2.join(); 
       answer = f1.answer + f2.answer; 
      } 
      catch(InterruptedException ex) { } 
     } 
    } 

    public static void main(String[] args) 
     throws Exception 
    { 
     try { 
      Fib f = new Fib(Integer.parseInt(args[0])); 
      f.start(); 
      f.join(); 
      System.out.println(f.answer); 
     } 
     catch(Exception e) { 
      System.out.println("usage: java Fib NUMBER"); 
     } 
    } 
} 
+5

아침에 숙제 냄새가납니다. –

+1

@ivo 숙제가 아닙니다! – Mariah

+4

시퀀스의 각 요소가 마지막 함수이기 때문에 다중 스레드 피보나치 생성기를 작성할 수 있는지 확신 할 수 없습니다. – cdhowie

답변

0

현재 스레드 수/스레드의 폴링 또는 smt를 포함 할 스레드에 대한 팩토리를 만들 수 있습니다. 이 팩토리의 주요 쟁점은 스레드 생성입니다.

2

fib()를 두 번 호출 할 때마다 분기하는 것이 비효율적입니다. 피보나치 시리즈의 계산은 선형 시간으로 수행되어야합니다. this question에 대한 답변을 참조하십시오.

그렇다면 여전히 스레드를 사용하고 싶다면 메모 작성 및/또는 향후 결과 사용이 필수적입니다.


+0

각 결과는 이전 버전에서는 병렬로 수행 할 수있는 독립적 인 작업이 없습니다. –

0

피보나치는, 그러나 그 아마도 또한 하나 개의 스레드가 빠르게 사용할 때의 가장 좋은 예입니다 주목해야한다 쉬운 이해하고 숙제가 좋은 만드는 구현하기 때문에 스레드를 많이 생성하는 일반적인 예입니다 여러 스레드를 사용하는 것보다 그 이유는 많은 스레드를 갖는 오버 헤드가 기하 급수적 인 결과에 비례한다는 것입니다.

즉, 최적의 스레드 수는 하나입니다. 일단 그 사실을 알게되면 코드가 훨씬 간단해질 것입니다.

코드를 최적화하려면 루프에서 첫 번째 값부터 값을 작성해야합니다. 1, 1, 2, 3, 5, 8 ...로 시작하십시오. 이렇게하면 기하 급수적으로 걸려 오는 전화 수가 줄어 듭니다.

관련 문제