线程的一个练习题,我已经按照题目要求实现了,但总感觉别扭,求高手修改

题目如下:
编写10个线程,第一个线程从1加到10,第二个线程从11加到20,。。。。第10个线程从91加到100,最后再把10个线程结果相加。

但是,感觉自己写的太复杂,求高手指点优化。图片图片

5个回答

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

你可以观察一下执行效率,循环次数太少是看不出来的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐