0%

Java多线程-练习

题目

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();

}
}
技术分享,如果您觉得内容不错的话不妨进行打赏,您的支持将鼓励我继续创作!


如果你对本文有看法或更好的见解可以点击下方按钮进行评论
*注:本站为非交互网站
此按钮将会转跳至评论站点 i-nmb.chat 进行评论

欢迎关注我的其它发布渠道