随机生成一个数n,然后随机生成n个数字。
计算1:n个数字直接相加总和1
计算2:将n个数字对半分,前一半相加完sum1和后一半相加完sum2,最终n个数字总和 2 (sum1+sum2)。
判断计算1 和计算2的 时间花费哪个大。
单单直接start 主线程和两条支线程 执行时间不一样,导致主线程提前结束。
可以直接用join来解决这个问题。还有我自己想的一个办法(这个办法,可能有点糟糕)
import java.util.Random;
class MyThread extends Thread{
private int st,ed;
private long num[];
private long sum;
private String name;
public MyThread(int st,int ed,long num[],String name){
this.st=st;this.ed=ed;this.num=num;this.sum=0;this.name=name;
}
public void run(){
for(int i=st;i<=ed;i++){
sum+=num[i];System.out.println(name+num[i]);
}
}
public long getSum(){
return sum;
}
}
public class P7_01 {
public static void main(String args[]) throws InterruptedException
{
//生成随机数n,再生成n个随机数->[]
Random r=new Random();
int n=r.nextInt(100)+10;
long num[];
num = new long[n+1];
for(int i=1;i<=n;i++){
num[i]=r.nextInt(100);
}
//计算s1,t1
long s1=0;double t1=0;
double startTime1 = System.currentTimeMillis();
for(int i=1;i<=n;i++){
s1+=num[i];
System.out.println(num[i]);
}
double endTime1 = System.currentTimeMillis();
t1=endTime1-startTime1;
System.out.println("----------");
//多线程计算s2,t2
long s2=0,s21=0,s22=0;double t2=0;
MyThread mt1=new MyThread(1,n/2,num,"1 ");
MyThread mt2=new MyThread(n/2+1,n,num,"2 ");
double startTime2 = System.currentTimeMillis();
mt1.start(); mt2.start();
mt1.join();mt2.join();
s21=mt1.getSum();
s22=mt2.getSum();
s2=s21+s22;
double endTime2 = System.currentTimeMillis();
t2=endTime2-startTime2;
//输出结果
System.out.println("s1:"+s1+" t1:"+t1+"\ns2:"+s2+" t2:"+t2);
if(s1<s2) System.out.println("s1<s2");
else if(s1==s2) System.out.println("s1==s2");
else System.out.println("s1>s2");
if(t1<t2) System.out.println("t1<t2");
else if(t1==t2) System.out.println("t1==t2");
else System.out.println("t1>t2");
}
}
我的办法:while循环。。。尴尬的方法
mt1.start(); mt2.start();
while(mt1.isAlive() || mt2.isAlive()){}
if(!mt1.isAlive()) s21=mt1.getSum();
if(!mt2.isAlive()) s22=mt2.getSum();
if(!mt1.isAlive() && !mt2.isAlive()){
s2=s21+s22;
double endTime2 = System.currentTimeMillis();
t2=endTime2-startTime2;
//输出结果
。。。。。;
}