题目如下:
编写10个线程,第一个线程从1加到10,第二个线程从11加到20,。。。。第10个线程从91加到100,最后再把10个线程结果相加。
但是,感觉自己写的太复杂,求高手指点优化。
times++ 必须同步,要不然有线程安全问题。
而且你每个线程后都加join 那和一个线程执行有什么区别吗?
你这样把a()方法锁住的话,那和一个线程直接执行1直接加到100又有什么区别呢?
package com.bizfocus;
public class DoSum implements Runnable{
long sum=0;
int addTime=0;
//执行方法一:在 此方法名前加synchronize关键字,取消注解1的注释,将注解2处的代码注释掉,执行。
//执行方法二:直接按我的源代码执行
public void add(int start){
long tempSum=0;
for(long i=start*10+1;i<=(start+1)*100000;i++){
tempSum=tempSum+i;
for(int j=0;j<100000;j++){
}
}
/* this.sum=this.sum+tempSum;
addTime++;*///注解1
doLast(tempSum);//注解2处的代码
if(addTime>=10){
System.out.println(sum+" Sum");
System.out.println("结束时间:"+System.currentTimeMillis());
}
}
public synchronized void doLast(long tempsum){
this.sum=this.sum+tempsum;
addTime++;
}
@Override
public void run() {
// TODO Auto-generated method stub
add(Integer.parseInt(Thread.currentThread().getName().split("Thread")[1]));
}
}
package com.bizfocus;
import org.junit.Test;
public class DoSumTest {
@Test
public void multiThread_sum(){
System.out.println("开始时间:" +System.currentTimeMillis());
DoSum ds =new DoSum();
for(int i=0;i<10;i++){
Thread t=new Thread(ds);
t.setName("Thread"+i);
t.start();
}
}
}
你可以观察一下执行效率,循环次数太少是看不出来的