Java中的多线程:只有一个线程正确执行,其他线程终止

时间:2014-10-20 17:17:23

标签: java multithreading

以下是问题陈述:

使用线程编写一个java程序来计算前25个素数,以及 计算前50个斐波纳契数。设置计算的线程的优先级 Fibonacci数为8,另一个为5.计算30个Fibonacci数后,make 那个线程要睡觉并接受素数计算。计算完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 个答案:

答案 0 :(得分: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;
                }
            }
        }
    }