首先这道题我们需要键盘输入线程数
根据线程数来计算出每条线程需要计算的范围数
求出范围的最大值和最小值
上代码
一:主线程
import java.util.Scanner;
public class Text {
public static void main(String[] args) {
//输入
Scanner scanner=new Scanner(System.in);
//提示
System.out.println("请输入几条线程");
//记录
int size=scanner.nextInt();
//计算平均值
int avg=100/size;
//创建同步对象
LockTarget lockTarget=new LockTarget(size);
//根据用户需求创建线程数
for(int i=1;i<=size;i++){
//每条线程的最小值
int min=(i-1)*avg+1;
//每条线程的最大值
int max=i==size?100:i*avg;
CommonThread common=new CommonThread(min,max,lockTarget);
//启动线程
common.start();
}
}
}
二:同步对象类
/**
* 同步对象
*/
public class LockTarget {
private int size;//线程总数
private int targe;//计算总和
public LockTarget(int size) {
this.size = size;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getTarge() {
return targe;
}
public void setTarge(int targe) {
this.targe = targe;
}
}
三:线程:
/**
* 线程
*/
public class CommonThread extends Thread{
private int min;
private int max;
//传入同步对象
private LockTarget lockTarget;
//创建构造方法
public CommonThread(int min, int max, LockTarget lockTarget){
this.min=min;
this.max=max;
this.lockTarget=lockTarget;
}
//重写run方法
@Override
public void run() {
//定义一个计算一个线程总和的值
int sum=0;
//每个线程所计算的范围不同(见Text)
for(int i=min;i<=max;i++){
sum+=i;
}
//设置同步
synchronized (lockTarget){
//改变同步对象中的记录最后总和的值
lockTarget.setTarge(lockTarget.getTarge()+sum);
//改变同步对象中的线程总和 每走到这里一次 线程数将减少一次
lockTarget.setSize(lockTarget.getSize()-1);
//当线程数为0时 意味着线程执行结束,这时的targe就是最终的总和
if(lockTarget.getSize()==0){
System.out.println(lockTarget.getTarge());
}
}
}
}
总结:具体的代码用途注释写的应该还算清楚,这是一道我学习多线程中遇到的第一道习题,还算比较基础简单的,适合刚学习线程的同学学习。