2014-10-20 121 views
0

這是問題的聲明:多線程Java中:只有一個線程被正確執行和其他線程被終止

使用線程來計算前25張素數寫Java程序,並 計算前50個斐波那契數字。將斐波那契數的計算公式爲 的線程的優先級設置爲8,將另一個設置爲5.在計算30個斐波納契數字之後,使線程進入睡眠狀態並執行質數計算的 。在計算完素數後繼續進行斐波那契數的計算。

我的代碼:

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

不,它會幫助,但什麼是聲明你兩個'DISP()'方法是'synchronized'的地步? – 2014-10-20 18:11:56

+0

我建議你做一些重新分解。擺脫boolean isPrime變量,並寫一個'private boolean isPrime(int p)'函數。然後在嘗試在多線程程序中使用它之前,在單線程程序中測試該函數。 – 2014-10-20 18:15:42

回答

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 2014-10-20 18:20:07