java-多线程

随机生成一个数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;
	//输出结果
	。。。。。;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值