日期:2014-05-20  浏览次数:20705 次

JAVA 线程中有个疑问
最近在研究线程,现有如下代码让我十分困惑

public class TestThread {

public static void main(String[] args){
Object obj = new Object();
//Object ect = new Object();
synchronized(obj){
new Thread1().start();
/*try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
//obj.notifyAll();
synchronized(obj){
new Thread2().start();
}
}

}
class Thread1 extends Thread{
public void run(){
for(int i = 0;i<100;i++){
System.out.println("--------------------->>"+i);
}
}
}
class Thread2 extends Thread{
public void run(){
for(int i = 0;i<100;i++){
System.out.println("================================="+i);
}
}
}

为什么我的这段代码的运行结果是两个线程交替运行,而不是一个线程运行完之后,运行另一个线程?
为什么我使用synchronized加锁没有任何效果?
如果我想让一个线程运行完之后再运行另一个线程,我应该怎么办?

------解决方案--------------------
你的代码在进入第一个synchronized代码块的时候,当前线程是main线程。不会遇到锁,因为只有它一个线程。
start()方法调用完了,main线程迅速返回,
进入第二个synchronized代码块时,虽然有两个线程在,但是没有竞争,main线程依然顺利进入,将Thread2 start。
后面的事情就是两个线程同时(交替)运行了。