当前位置: 首页 > 知识库问答 >
问题:

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

冯嘉珍
2023-03-14

以下是问题陈述:

编写一个java程序,使用线程计算前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个答案

贺功
2023-03-14

你没有重置素数布尔值

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;
                }
            }
        }
    }
 类似资料:
  • 我如何启动两个线程,其中thread1首先执行,thread2在thread1结束时启动,而主方法线程可以在不锁定其他两个线程的情况下继续工作? 我尝试了join(),但是它需要从线程调用,线程必须等待另一个线程,没有办法执行类似thread2.join(thread1)的操作;因此,如果我在main()中调用join,我将有效地停止主线程的执行,而不仅仅是Thread2的执行。 #编辑:为什么我

  • 我用的是Netty camel-Netty:jar:2 . 10 . 0 . red hat-60024。下面是我对Netty监听器的配置 荨麻:tcp://10.1.33.204:9001?textline=true 在这里,我看到基于调试日志,Netty只创建一个工作线程,所以传入的消息被阻塞,直到现有的消息被处理。 喜欢: 2014-08-23 12:36:48,394|DEBUG|w I/

  • 在Flink中,像“平面地图”、“地图”等运算符称为任务,如果我将平面地图的并行度设置为30,那么这个任务有30个子任务。 现在,如果我只有一个插槽,它会在一个插槽中产生多个线程吗?还是每个插槽只有一个线程? Flink会在该插槽中简单地创建30个线程,还是使用类似线程池的东西? 以上不是一个恰当的例子。 假设在作业中我有操作符flatMap和map,它们都有并行度1,我只有一个插槽,这个插槽会创

  • 我试图用一个自定义对象创建一个新线程,然后从主线程调用这个自定义对象方法。其思想是,主线程可以继续执行其他任务,而自定义对象可以继续在第二个线程中工作: 输出为: 它应该更像这样: 所以主线程被阻塞,直到方法完成。主线程是否在第二个线程中等待完成(作为返回类型为空,我认为情况不会如此)?还是在第一个线程中执行,因此阻塞了它? 我知道使用下面的代码,我可以在另一个线程中执行,但它每次都会从头开始创建

  • 问题内容: 我在Java中的线程上有些挣扎,我有三个线程- 线程1,线程2和线程3。那些启动时正在执行某些任务,我想通过thread1停止这两个线程。我将thread1放在,然后停止两个线程,但是两个线程的进程仍在运行。你有什么想法吗? 问题答案: 您如何试图阻止他们??警告此方法已弃用。 而是考虑对线程1使用某种标志来与线程2和3通信,它们应该停止。实际上,您可能会使用interrupts。 下

  • 我在尝试停止运行多个线程的程序时遇到了问题,所有运行的线程都试图找到相同的解决方案,但一旦一个线程找到了解决方案,所有其他线程都将停止。 在main方法中,我创建了一个线程组,使用for循环向其中添加线程并启动它们 在实现Runnable的类中,我很难找出如何使其实现,以便一旦其中一个线程找到解决方案,所有线程都将停止。最终发生的情况是,要么其他线程继续运行,有时这些线程会相互中断并相互覆盖。