首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

跪求多线程事例,要有代码

2013-08-09 
跪求多线程例子,要有代码本帖最后由 lin9118 于 2013-07-29 16:09:29 编辑比如我想计算1~1000的累加,单线

跪求多线程例子,要有代码
本帖最后由 lin9118 于 2013-07-29 16:09:29 编辑 比如我想计算1~1000的累加,单线程就是用一个for循环从1加到1000,现在我想用两个线程实现1~1000的累加,思想是:用线程1累加1~500。用线程2累加501~1000。然后返回两个结果并相加得出正确结果。两个线程要同时运行,是同时运行,不是交替运行,如果是交替运行那跟单线程就没什么区别了。能否实现?如果可以实现,那么理论上多线程运行到得出结果所用的时间是不是单线程的一半?求各位大神解答,并附上代码,理论没有经过验证都是扯淡
[解决办法]
两个对象两个线程,控制一个类的结果:


package com;

public class Test3 extends Thread{
XX xx;
int start;
public Test3(XX xx,int start){
this.xx=xx;
this.start=start;
}


public void run(){
int num=0;
for(int i=start;i<start+500;i++){
num+=i;
}
if(this.start==0){
xx.setNum1(num);
xx.setFlag1(true);
}else if(this.start==500){
xx.setNum2(num);
xx.setFlag2(true);
}
if(xx.isFlag1()&&xx.isFlag2()){
System.out.println(xx.getNum1()+xx.getNum2());
}
}

public static void main(String[] args) {
XX xx=new XX();
new Test3(xx, 0).start();
new Test3(xx, 500).start();
}

}

class XX{
public int num1=0;
public int num2=0;
public boolean flag1=false;
public boolean flag2=false;


public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public boolean isFlag1() {
return flag1;
}
public void setFlag1(boolean flag1) {
this.flag1 = flag1;
}
public boolean isFlag2() {
return flag2;
}
public void setFlag2(boolean flag2) {
this.flag2 = flag2;
}

}

[解决办法]
给增加操作做一个SLEEP 不然看不出效果 就如2楼说的 多线程反而慢了
package a.b.test; 



import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Calculate1000  implements Callable<Integer>{
public Calculate1000(){}

public Calculate1000(int a, int b){
this.a = a;
this.b = b;

}

int a;
int b;

/**
 * @param args
 * @throws Exception 
 */
public static void main(String[] args) throws Exception {
//同步
Calculate1000 ca1 = new Calculate1000();
Date ds1 = new Date();
int result = 0;
for(int i = 1 ; i <= 1000 ; i++){
result = ca1.add(i, result);
}
System.out.println(result);
System.out.println("同步用时" + (new Date().getTime() - ds1.getTime()) + "MS");

//异步
Date ds2 = new Date();
result = 0;
ExecutorService es = Executors.newFixedThreadPool(2);
Future<Integer> future1 = es.submit(new Calculate1000(1,500));
Future<Integer> future2 = es.submit(new Calculate1000(501,1000));
result = future1.get() + future2.get();
System.out.println(result);
System.out.println("异步用时" + (new Date().getTime() - ds2.getTime()) + "MS");
es.shutdown();
}

private int add(int a, int b) throws Exception{
Thread.sleep(10);
return a + b;
}

@Override
public Integer call() throws Exception {
int res = 0;
for(int i = a ; i <= b ; i++){
res = this.add(res, i);
}
return res;
}
}

热点排行