多线程Java中:只有一个线程被正确执行和其他线程被终止
问题描述:
这是问题的声明:多线程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
我期待质数的休息时,斐波那契线停止要打印,但是这并没有发生,什么可能是这背后的原因是什么?
答
你是不是正在重置的首要布尔
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
不,它会帮助,但什么是声明你两个'DISP()'方法是'synchronized'的地步? – 2014-10-20 18:11:56
我建议你做一些重新分解。摆脱boolean isPrime变量,并写一个'private boolean isPrime(int p)'函数。然后在尝试在多线程程序中使用它之前,在单线程程序中测试该函数。 – 2014-10-20 18:15:42