class MyArray{
private long[]a;
private int foot;
public MyArray(int len){
this.foot=0;
if(len<0){
a=new long[1];
}else{
a=new long[len];
}
}
public boolean add(long i){
if(this.foot<this.a.length){
a[foot]=i;
this.foot++;
return true;
}else{
return false;
}
}
public long[] getArray(){
return this.a;
}
public long calcuate(int begin,int end){
long sum=0;
for(int i=begin;i<=end;i++){
sum+=a[i];
}
return sum;
}
}
class MyThread1 extends MyArray implements Runnable{
private long result=0;
private int len=0;
public MyThread1(int len){
super(len);
this.len=len;
}
public void run(){
long sum=super.calcuate(0,len/2);
System.out.println("线程一的计算结果:"+sum);
result=sum;
}
public long getResult(){
return this.result;
}
}
class MyThread2 extends MyArray implements Runnable{
private long result=0;
private int len=0;
public MyThread2(int len){
super(len);
this.len=len;
}
public void run(){
long sum=super.calcuate(1+len/2,len-1);
System.out.println("线程二的计算结果:"+sum);
result=sum;
}
public long getResult(){
return this.result;
}
}
public class ThreadDemo{
public static void main(String args[]){
int len=10000000;
MyArray ma=new MyArray(len);
MyThread1 mt1=new MyThread1(len);
MyThread2 mt2=new MyThread2(len);
for(int i=0;i<len;i++){
long n=(long)(Math.random()*9999999);
ma.add(n);
mt1.add(n);
mt2.add(n);
}
long start1=System.currentTimeMillis();
long result1=ma.calcuate(0,len-1);
long end1=System.currentTimeMillis();
System.out.println("计算结果为"+result1+",花费了"+(end1-start1)+"毫秒");
long start2=System.currentTimeMillis();
new Thread(mt1).start();
new Thread(mt2).start();
long result2=mt1.getResult()+mt2.getResult();
long end2=System.currentTimeMillis();
System.out.println("采用双线程计算结果为"+result2+",花费了"+(end2-start2)+"毫秒");
}
}
为什么不能得到正确结果,求大神指点!!!多线程 加法
private long[]a;
private int foot;
public MyArray(int len){
this.foot=0;
if(len<0){
a=new long[1];
}else{
a=new long[len];
}
}
public boolean add(long i){
if(this.foot<this.a.length){
a[foot]=i;
this.foot++;
return true;
}else{
return false;
}
}
public long[] getArray(){
return this.a;
}
public long calcuate(int begin,int end){
long sum=0;
for(int i=begin;i<=end;i++){
sum+=a[i];
}
return sum;
}
}
class MyThread1 extends MyArray implements Runnable{
private long result=0;
private int len=0;
public MyThread1(int len){
super(len);
this.len=len;
}
public void run(){
long sum=super.calcuate(0,len/2);
System.out.println("线程一的计算结果:"+sum);
result=sum;
}
public long getResult(){
return this.result;
}
}
class MyThread2 extends MyArray implements Runnable{
private long result=0;
private int len=0;
public MyThread2(int len){
super(len);
this.len=len;
}
public void run(){
long sum=super.calcuate(1+len/2,len-1);
System.out.println("线程二的计算结果:"+sum);
result=sum;
}
public long getResult(){
return this.result;
}
}
public class ThreadDemo{
public static void main(String args[]){
int len=10000000;
MyArray ma=new MyArray(len);
MyThread1 mt1=new MyThread1(len);
MyThread2 mt2=new MyThread2(len);
for(int i=0;i<len;i++){
long n=(long)(Math.random()*9999999);
ma.add(n);
mt1.add(n);
mt2.add(n);
}
long start1=System.currentTimeMillis();
long result1=ma.calcuate(0,len-1);
long end1=System.currentTimeMillis();
System.out.println("计算结果为"+result1+",花费了"+(end1-start1)+"毫秒");
long start2=System.currentTimeMillis();
new Thread(mt1).start();
new Thread(mt2).start();
long result2=mt1.getResult()+mt2.getResult();
long end2=System.currentTimeMillis();
System.out.println("采用双线程计算结果为"+result2+",花费了"+(end2-start2)+"毫秒");
}
}
为什么不能得到正确结果,求大神指点!!!多线程 加法
解决方案 »
- 如何替换字符串中包含问号的字符串
- 请各位同事,帮忙呀。版主帮忙,本人竞选十大杰出青年,帮投票呀
- 初学Java,应该重点注意什么
- 如何import第三方JAR包根目录下的class类
- 有什么修饰符可以让变量第一次赋值后就不可改变了?
- 请问大家一个问题,现在有一个父类F,里面用ThreadLocal()对象记录了某个资源(比如Connection),然后有很多类extends这个F,其他的类通
- 有一串字符"=(A,BC)",我只想取()内的A, B,C请问有什么函数取吗?
- 总结
- 怎么样得到选定文件的绝对路径。。。。
- 请教一个有关JDBC连接方式的问题
- 求议论,关于子父类私有变量问题
- Java新手又来提问鸟,关于将int型赋给char和将char型赋int~
MyArray ma=new MyArray(len);
len: 一千万,也就是10M个MyArray
然后在MyArray的构造函数里:
a=new long[len];
10M个long型,一个long型8个字节,总共是80M
也就是这一句初始化,需要内存:80M*10M
在楼主的机器上能运行下去???(还是我算的有问题?)
new Thread(mt1).start();
new Thread(mt2).start();
long result2=mt1.getResult()+mt2.getResult();
long end2=System.currentTimeMillis();
System.out.println("采用双线程计算结果为"+result2+",花费了"+(end2-start2)+"毫秒");new Thread(mt1).start();
new Thread(mt2).start();
这个只是告诉虚拟机这两个线程启动了,所以直接就到了long end2=System.currentTimeMillis();
所以此时的时间和start2基本是一样的
等到你打印的时候发现需要用到start2,那么打印的时候就会等待你的线程执行完毕,然后得到result的值,所以en2-start2=0