帮忙分析一个线程问题
public class Computation extends Thread {
private int num;
private boolean isComplete;
private int result;
public Computation(int num) {
this.num = num;
}
public synchronized void run() {
result = num * 2;
isComplete = true;
notify();
}
public synchronized int getResult() {
while (!isComplete) {
try {
wait();
} catch (InterruptedException e) {
}
}
return result;
}
public static void main(String[] args) {
Computation[] computations = new Computation[4];
for (int i = 0; i < computations.length; i++) {
computations[i] = new Computation(i);
computations[i].start();
}
for (Computation c : computations)
System.out.print(c.getResult() + " ");
}
}
对这个问题,我有以下2个疑惑:
1.这个程序有必要加synchronized给 getResult()和run()方法吗?建立四个线程,我认为这四个线程是彼此独立的线程,根本不会存在有并发的情况。我试着把synchronized关键字和notify和 wait方法去掉之后,结果输出的结果跟之前的一模一样。
2.为什么这个题目的输出顺序,一直是0 2 4 6,并且顺序一直不会改变。按理说,四个线程创建后,进入就训状态,被CPU分配时间片也是随机的(我在run()方法里做了测试,是这样的)。那么输出的顺序也该是随机的。到底这程序哪个地方保证了它按顺序输出呢?