如题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
我是左手线程
我是左手线程
我是左手线程

解决方案 »

  1.   

    为什么让主线程睡眠一会儿就没问题,不睡眠就会得不到正确结果,是不是java的bug呀
      

  2.   

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

  3.   

    楼主你见过一个run方法家synchronize关键字的么,知道synchronize的意义么,既然是一个个线程启动要执行的方法,你还要进行同步,你到底想同步这个线程呢还是...........
      

  4.   


    ”LogicTeamLeader“ 你确定用的是我注释掉的sleep吗,在我的电脑上要将上述代码上中的sleep注释打开才能每次都用得出正确的、一样的结果,也就是join()才会起作用。如果不打注释打开,join()就会失效
      

  5.   

    我的问题不在于时间片,我猜你们没有看到的代码中用了join()函数,这是为了控制线程的执行顺序
    我的目的是为了让上述的代码按1、2、3、4输出,当然这些数字只是调试用.
    可能是我没有把 问题说清楚,我是怀疑join()这个函数有BUG,因为按JAVA文档的说法join是可以控制线程顺序且没有什么条件。显然事实上不是我代码已经说明了这点,因为只有将上述代码上的sleep的注释去掉,join()才起作用。也就是说join()如果要在循环体中起作用,必须让在循环体中加sleep.这才是我想与大家论的
      

  6.   

    你说对了,如果直接将上述代码复制运行,结果是不可靠的。这也是我想问的,论理上结果应该是可靠的因为我用的join()函数来控制顺序。你可能认为是我的join()放的位置有问题,事实上不是,你看到上面的代码中有一个注释掉的sleep吗?如果你把注释打开,join就起作用了,就可以得到可靠的结果。问题是为什么要加sleep那个join才会起作用呢。另外我也试了一下如果不加sleep只要把循环去掉,join()函数也可以生效。那为什么唯独在循环体中不起作用呢?我想了很久,找不出答案。可能真的是java的BUG
      

  7.   

    “如果你把注释打开,join就起作用了,就可以得到可靠的结果。”你认为的可靠结果是怎样的?
      

  8.   

    tl.start();System.out.println("1");
    tl.join();
    我测试时,程序在第一次循环时,t1线程有时先输出,(比主线程main). 有时是main先输出“1”。这个是不定的。(与sleep没有绝对的关系)。
    以后的循环,都是main先输出“1”。之后主线程等待,t1线程执行完。输出都是一样的,我测试10次以上,都是如下的:1
    我是左手线程
    我是左手线程
    我是左手线程
    我是左手线程
    2
    我是主线程
    我是主线程
    我是右手线程
    我是右手线程
    我是右手线程
    我是右手线程
    我是主线程
    3
    4我的意思是楼主看到的结果 与sleep没有关系。
      

  9.   

    我终于想明的了,其实真的如'nmyangym'所说的加不加sleep其结果都一样,是开发工具的问题。在没有加sleep的时候由于显示速度太快数据太多,控制台会清理掉最开始显示的数据,而只显示最后输出的一部数据,这就是为什么不加sleep时每次都看到不一样结果的原因,因为执行时间不一样,截断显示出来的结果一定不样,我在CMD上手动执行时发现的。我前一直没有注意这个问题,这总算是给了我一个教训,在这个问题上白白浪费了这多时间。
    不过个也算是一个经验:“显示出来不一定是真实的”
    感谢'nmyangym'、‘LogicTeamLeader’,别的人显然没有明白我的意思
      

  10.   

    要是学习线程部分的内容,最好先清楚一件事——使用的电脑是不是单核的。
    只有单核的电脑运行结果才会如java中所讲的那样。如果电脑是多核的,那就会多个线程一起执行,就算sleep了一个线程,其他线程也不一定会阻塞在那里。