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

我发现join在循环体使用中会出现意不到的结果,不知道是java的bug,还是我用法的问题.求高手指导
如题

public class Hand implements Runnable {
private String name;

public Hand(String name) {
super();
this.name = name;
}

@Override
synchronized public void run() {
// TODO Auto-generated method stub
for(int i=0;i<4;i++){
System.out.println(name);
}
}


public class mainthread {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Hand leftHand=new Hand("我是左手线程");
Hand rightHand=new Hand("我是右手线程");
while(true){
try {
Thread tl=new Thread(leftHand);
tl.start();

System.out.println("1");
tl.join();
System.out.println("2");
for(int i=0;i<3;i++){
if(2==i){
Thread tr=new Thread(rightHand);
tr.start();
tr.join();
}
System.out.println("我是主线程");
}
//Thread.sleep(10);
System.out.println("3");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println("4");
}
}



}

运行结果如下
我是左手线程
2
我是主线程
我是主线程
我是右手线程
我是右手线程
我是右手线程
我是右手线程
我是主线程
3
4
1
我是左手线程
我是左手线程
我是左手线程
我是左手线程
2
我是主线程
我是主线程
.........
反正每次运行都不一样

但如果把//Thread.sleep(10);中的注释取消就可以得到我欲期的结果:
1
我是左手线程
我是左手线程
我是左手线程
我是左手线程
2
我是主线程
我是主线程
我是右手线程
我是右手线程
我是右手线程
我是右手线程
我是主线程
3
4
1
我是左手线程
我是左手线程
我是左手线程


------解决方案--------------------
我试了,sleep或者不sleep,结果都是正确的,请你仔细看看你的输出。


探讨
高手们都忙吗,这么久了没人看看

------解决方案--------------------

Java code

tl.start();

System.out.println("1");
tl.join();