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

问题描述

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

题目如下:
编写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();
}
}
}

解决方案五:

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

时间: 2024-09-04 05:08:58

thread 方面的问题-线程的一个练习题,我已经按照题目要求实现了,但总感觉别扭,求高手修改的相关文章

jsp问题-一个简单jsp文件检查了好几遍不知道为什么报错,求高手指点

问题描述 一个简单jsp文件检查了好几遍不知道为什么报错,求高手指点 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> <% Locale locale = request.getLocale(); Calendar calendar = Calendar.getInstance(locale); int

java使用回调和线程处理一个耗时响应全过程

现在程序中有许多涉及长耗时响应过程的处理,比如访问WebService,远程调用,复杂处理等,如果我们使用直接顺序执行的方式进行处理有可能导致界面停顿,响应停止,无谓等待等缺陷,这是不应该的. 一个耗时响应过程应该采用回调和线程来处理,具体就是把原来的顺序执行修改为异步方式,并让被调用者调用调用者以获得执行结果.在附件的例子中,Viewer就是调用者,它代表界面,而LongTimeResponse是被调用者,它内部用线程启动一个耗时过程,执行完毕再通知调用者. Viewer类代码如下: publ

线程同步的一个问题,求高手指导

问题描述 线程同步的一个问题,求高手指导 public class TestTicket{ public static void main(String[] args){ SellTickets st = new SellTickets(); Thread t1 = new Thread(st,"窗口1--"); Thread t2 = new Thread(st,"窗口2--"); Thread t3 = new Thread(st,"窗口3--&quo

python 线程的一个小问题

问题描述 python 线程的一个小问题 源代码如下: import threadfrom time import sleep ctimeloops = [4 2]def loop(nloop nsec lock): print 'start loop' nloop ' at: ' ctime() sleep(nsec) print 'loop' nloop 'at: ' ctime() lock.release()def main(): print 'starting at: ' ctime(

关于线程的一个小问题:

问题描述 关于线程的一个小问题: 写十个线程,第一个线程求1到10的和,第二个11到20的和,第三个求21到30的和...第10个求91到100的和,求十个线程的和 解决方案 new是个Thread,每个Thread传入起始数字 解决方案二: 我觉得是否可以这样,你创建10个线程,在线程函数中增加一个flag参数,另外,创建一个全局的数组,10个元素,分别存放10个线程自己的值, 在运行这些线程的时候,传入falg参数,比如: static a[10] int; flag int; sum in

Thread建立的后台线程是利用线程池来实现的吗?

问题描述 1.异步委托是使用线程池来使用的.2.线程池里的都是后台线程.3.Thread可以建立前台线程和后台线程.问题:是否和异步委托一样,Thread建立的后台线程是利用线程池来实现的吗?如何验证结论? 解决方案 解决方案二:后台线程和线程池没有关系解决方案三:首先,创建和销毁线程是一个要耗费大量时间的过程,另外,太多的线程也会浪费内存资源,所以通过Thread类来创建过多的线程反而有损于性能,为了改善这样的问题,.net中就引入了线程池.线程池形象的表示就是存放应用程序中使用的线程的一个集

求高手点拨一个:“Java线程类”的问题.

问题描述 求高手点拨:一个子线程中,应该不能再架子线程了吧..?怎么下面的代码:publicvoidrun(){newThread(newRunnable(){publicvoidrun(){while(true){try{System.out.println(ssoo1.read(so3)+"----------------------");}catch(IOExceptione1){e1.printStackTrace();}}}}).start();System.out.prin

java 中如何实现多个线程共享一个类

问题描述 java 中如何实现多个线程共享一个类 预想: 一个类 ClassA 中的一个类变量 public static int data = 100; 我起一个main方法 调用 ClassA.data = 200; 再起一个main方法 读取ClassA.data 获取的值就是200? 任意线程修改单例的ClassA 其他线程读取都是最新的 如何做到? 解决方案 java如何实现多个线程并发运行 解决方案二: 启动2个main,不是线程,是进程. 解决方案三: 用final修饰 publi

请教一个java线程的一个小问题,求程序执行流程,打印结果为1000 b=1000

问题描述 public class Test implements Runnable{int b = 100;public synchronized void m1() throws Exception{b =1000;Thread.sleep(5000);System.out.println("b:"+b);}public synchronized void m2() throws Exception{Thread.sleep(2500);b = 2000;}public void