题目
1.编写具有两个线程的程序,第一个线程用来计算2-1000000之间的质数及个数,第二个线程用来计算1000000-2000000之间的质数及个数。
2.编写多线程程序,显示目前正在运行的线程名和目前的活动线程数。
第一题
先将类继承,即extends Thread
,并定义必要的数(开始数和结尾数)
定义构造类
1 2 3 4
| public Double(int begin,int end){ this.begin=begin; this.end=end; }
|
创建处理函数
简单的素数问题处理函数,具体的做法可以自行百度
1 2 3 4 5 6 7 8 9 10 11 12 13
| public void PrimeNumber(){ for(int i=this.begin;i<=this.end;i++){ boolean isPrime = true; for(int j=2;j<=Math.sqrt(i);j++){ if(i%j==0) { isPrime=false; break; } } if(isPrime) jishu++; } System.out.println(begin+"到"+end+"有质数的个数为:"+jishu); }
|
主函数的处理
其实主函数只需要定义结构体然后引用解决方法即可
1 2 3 4 5 6 7
| public static void main(String[] args) { Double xiancheng1=new Double(2,1000000); Double xiancheng2=new Double(1000000,2000000); xiancheng1.PrimeNumber(); xiancheng2.PrimeNumber();
}
|
结果
![结果]()
完全符合新必应的回答
![新必应回答]()
改进
![指出错误]()
但是新必应(基于GPT4.0)指出我们的代码并没有启动新的线程,确实我们应该要重写run方法来调用处理判断素数的方法
1 2 3
| public void run() { PrimeNumber(); }
|
添加的同时也应该改变主方法中的方法调用
1 2
| xiancheng1.run(); xiancheng2.run();
|
第二题
要显示当前正在运行的线程名和当前的活动线程数,可以使用Thread.currentThread().getName()
来获取当前线程的名字,使用Thread.activeCount()
来获取当前活动线程的数量。
在你的代码中,可以在PrimeNumber()
方法的开头添加以下代码来显示当前正在运行的线程名:
1
| System.out.println("当前运行的线程名:" + Thread.currentThread().getName());
|
在main()
方法中,你可以在创建线程后立即输出当前的活动线程数,可以像这样修改你的代码:
1 2 3 4 5 6 7
| public static void main(String[] args) { Double xiancheng1 = new Double(2, 1000000); Double xiancheng2 = new Double(1000000, 2000000); System.out.println("当前活动线程数:" + Thread.activeCount()); xiancheng1.PrimeNumber(); xiancheng2.PrimeNumber(); }
|
这样,当运行程序时,将会显示当前正在运行的线程名和当前的活动线程数。
![错误结果]()
我们发现线程名均为main说明没有进行多线程服务,查找信息我们发现,主函数调用时候是使用start方法而非run方法
1 2
| xiancheng1.start(); xiancheng2.start();
|
结果
![正确结果]()
完整代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public class Double extends Thread{ private int begin=0; private int end=0; private int jishu=0; public Double(int begin,int end){ this.begin=begin; this.end=end; } public void run() { System.out.println("当前运行的线程名:" + Thread.currentThread().getName()); PrimeNumber(); } public void PrimeNumber(){ for(int i=this.begin;i<=this.end;i++){ boolean isPrime = true; for(int j=2;j<=Math.sqrt(i);j++){ if(i%j==0) { isPrime=false; break; } } if(isPrime) jishu++; } System.out.println(begin+"到"+end+"有质数的个数为:"+jishu); }
public static void main(String[] args) { Double xiancheng1=new Double(2,1000000); Double xiancheng2=new Double(1000000,2000000); System.out.println("当前活动线程数:" + Thread.activeCount()); xiancheng1.start(); xiancheng2.start();
} }
|