2. 加法程序。请编写一个程序,先产生一个大于10的随机整数n,再产生n个随机数并存在于数组中,然后将这n个数相加,请求出这n个数的和s1,同时计算出求s1所需要的时间t1。接着让线程创建两个线程并发地进行相加运算,其中,一个线程计算前一半数之和s21,另一个线程计算后一半数之和s22,然后将s21与s22这两个数相加得到和s2,计算采用双线程进行求和运算所花费的时间t2。请比较s1和s2,以及t1和t2的大小。我写出来的代码是:import java.util.Date;
class Assistant extends Thread
{
public boolean m_done;
private int n,i,x;
static int s21;
static long t1;
public Assistant(int n,int x)
{
this.n=n;
this.x=x;
}

public void run()
{
m_done = false;
int b[]=new int[n];
for(i=0; i<n;i++)
{
int a = (int)(Math.random()*10+10);
b[i]=a;
}
Date d1=new Date();
for(i=x; i<n/2;i++)
{
s21=s21+b[i];
}
Date d2=new Date();
t1=d2.getTime() - d1.getTime();
    Thread current=Thread.currentThread();
System.out.println("s21="+s21);   
System.out.println(current.getName()+"所用时间:"+t1);
m_done = true;
}
public static int getno()
{
return s21;
}
public static long gettime()
{
return t1;
}}public class Second extends Thread
{
public boolean m_done;
private int n,i,x;
static int s22;
static long t2;
public Second(int n,int x)
{
this.n=n;
this.x=x;
}

public void run()
{
m_done = false;
int b[]=new int[n];
for(i=0; i<n;i++)
{
int a = (int)(Math.random()*10+10);
b[i]=a;
}
Date d1=new Date();
for(i=x; i<n;i++)
{
s22=s22+b[i];

}
Date d2=new Date();
t2=d2.getTime() - d1.getTime();
    Thread current=Thread.currentThread();
System.out.println("s22="+s22);   
System.out.println(current.getName()+"所用时间:"+t2);
m_done =true;
}
public static int getno()
{
return s22;
}
public static long gettime()
{
return t2;
}
public static void main(String [] args){
int s1 = 0;
int n = (int)(Math.random()*10+10);
int b[]=new int[n];
for(int i=0; i<n;i++)
{
int a = (int)(Math.random()*10+10);
b[i]=a;
}
Date d1=new Date();
for(int i=0; i<n;i++)
{
s1=s1+b[i];
}
Date d2=new Date();
long t=d2.getTime() - d1.getTime();
System.out.println("s1="+s1);
System.out.println("计算s1所用时间:"+t);
Assistant f1 = new Assistant(n,0);
Second f2 = new Second(n,n/2);
f1.setName("线程一");
f2.setName("线程二");
f1.m_done=false;
f2.m_done=false;
f1.start();
f2.start();
if(!f1.m_done || !f2.m_done)
{
int s2 = Assistant.getno()+Second.getno();
System.out.println("s2="+s2);//s2=s21+s22;
}
else
{
System.out.print("error");
}

if(!f1.m_done || !f2.m_done)
{
long t2 = Assistant.gettime()+Second.gettime();
System.out.println("t2="+t2);//t2=t1+t2;
}
else
{
System.out.print("error");
}
}
}执行后的结果是:
s1=250
计算s1所用时间:0
s2=0
t2=0
s21=132
线程一所用时间:0
s22=138
线程二所用时间:0
我的问题是:为什么会先打印出来是s2=0,而不是打印
s21=132
线程一所用时间:0
s22=138
线程二所用时间:0

(至于线程所用时间那个先不用理了,因为虚拟机的运行速度太快了,Date d2=new Date();long t=d2.getTime() - d1.getTime();这个只是ms级的,所以是0了)
麻烦大家帮忙看一下。