2014-10-20 3 views
0

종료됩니다 문제 문입니다 :다중 스레딩 : 하나의 스레드가 제대로 실행됩니다 다른 스레드가 여기에

는 처음 25 개 소수를 계산하는 스레드를 사용하여 자바 프로그램을 작성하고, 에 처음 50 피보나치 계산 번호. 피보나치 수를 8로 계산하고 다른 숫자를 5로 계산하는 스레드의 우선 순위를 설정합니다. 피보나치 수를 30 개 계산 한 후 수면을 만들고 소수 계산을합니다. 25 소수를 계산하면 피보나치 수 계산이 계속됩니다.

내 코드 :

class Fibo{ 
    private int n=1,a=-1,b=1,c; 
    synchronized void disp(){ 
     for(int i=0;i<=45;i++){ 
      if(n==31) 
       try{ 
        System.out.println("Fibonacci Generation Halted"); 
        Thread.sleep(5000); 
       }catch(InterruptedException e){ 
        System.out.println("Caught interrupted exception"); 
       } 
      c=a+b; 
      System.out.println(n+" Fibo : "+c); 
      a=b; 
      b=c; 
      n++; 
     } 
    } 
} 
class Prime{ 
    int n=1; 
    boolean isPrime=true; 
    synchronized void disp(){ 
     for(int i=2;;i++){ 
      for(int j=2;j<=i/2;j++){ 
       if((i%j)==0){ 
        isPrime = false; 
        break; 
       } 
      } 
      if(isPrime){ 
       System.out.println(n+" Prime : "+i); 
       n++; 
       if(n==25){ 
        break; 
       } 
      } 
     } 
    } 
} 
class PrimeThread implements Runnable{ 
    Thread t; 
    Prime p1; 
    PrimeThread(){ 
     t=new Thread(this); 
     t.setPriority(Thread.NORM_PRIORITY); 
     t.start(); 
    } 
    public void run(){ 
     p1=new Prime(); 
     p1.disp(); 
    } 
} 
class FiboThread implements Runnable{ 
    Thread t2; 
    Fibo f; 
    FiboThread(){ 
     t2=new Thread(this); 
     t2.setPriority(8); 
     t2.start(); 
    } 
    public void run(){ 
     f=new Fibo(); 
     f.disp(); 
    } 
} 
class MainClass{ 
    public static void main(String args[]){ 
     FiboThread ft=new FiboThread(); 
     PrimeThread pt=new PrimeThread(); 
    } 
} 

OUTPUT: 
1 Fibo : 0 
2 Fibo : 1 
3 Fibo : 1 
4 Fibo : 2 
5 Fibo : 3 
6 Fibo : 5 
7 Fibo : 8 
8 Fibo : 13 
9 Fibo : 21 
10 Fibo : 34 
11 Fibo : 55 
12 Fibo : 89 
13 Fibo : 144 
14 Fibo : 233 
15 Fibo : 377 
16 Fibo : 610 
1 Prime : 2 
17 Fibo : 987 
2 Prime : 3 
18 Fibo : 1597 
19 Fibo : 2584 
20 Fibo : 4181 
21 Fibo : 6765 
22 Fibo : 10946 
23 Fibo : 17711 
24 Fibo : 28657 
25 Fibo : 46368 
26 Fibo : 75025 
27 Fibo : 121393 
28 Fibo : 196418 
29 Fibo : 317811 
30 Fibo : 514229 
Fibonacci Generation Halted 
31 Fibo : 832040 
32 Fibo : 1346269 
33 Fibo : 2178309 
34 Fibo : 3524578 
35 Fibo : 5702887 
36 Fibo : 9227465 
37 Fibo : 14930352 
38 Fibo : 24157817 
39 Fibo : 39088169 
40 Fibo : 63245986 
41 Fibo : 102334155 
42 Fibo : 165580141 
43 Fibo : 267914296 
44 Fibo : 433494437 
45 Fibo : 701408733 
46 Fibo : 1134903170 
이 뒤에 이유가 무엇인지 내가 피보나치 스레드가 정지 할 때 인쇄 할 수 있지만, 그렇게하지 않은 소수의 나머지 부분을 기대하고 있었다

?

+1

를 다시 설정하라는 그게 아니라면 도움이 될 것이라고하지만,'synchronized'을 할 당신이'DISP() '메서드를 선언하는 점은 무엇되지 않습니다? –

+0

나는 당신이 약간의 다시 생각하는 것을 제안한다. boolean isPrime 변수를 제거하고'private boolean isPrime (int p)'함수를 작성하십시오. 그런 다음 다중 스레드 프로그램에서이 함수를 사용하기 전에 단일 스레드 프로그램에서이 함수를 테스트하십시오. –

답변

0

당신은 주요 부울

class Prime{ 
    int n=1; 
    boolean isPrime=true; 
    synchronized void disp(){ 
     for(int i=2;;i++){ 
      isPrime=true; // YOU NEED TO RESET THIS!!! 
      for(int j=2;j<=i/2;j++){ 
       if((i%j)==0){ 
        isPrime = false; 
        break; 
       } 
      } 
      if(isPrime){ 
       System.out.println(n+" Prime : "+i); 
       n++; 
       if(n==25){ 
        break; 
       } 
      } 
     } 
    } 
+0

이것은 문제를 해결합니다 ... 왜 누군가가 그것을 다운 클릭했는지 전혀 알지 못합니다. – ControlAltDel

관련 문제