如题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
我是左手线程
我是左手线程
我是左手线程
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
我是左手线程
我是左手线程
我是左手线程
”LogicTeamLeader“ 你确定用的是我注释掉的sleep吗,在我的电脑上要将上述代码上中的sleep注释打开才能每次都用得出正确的、一样的结果,也就是join()才会起作用。如果不打注释打开,join()就会失效
我的目的是为了让上述的代码按1、2、3、4输出,当然这些数字只是调试用.
可能是我没有把 问题说清楚,我是怀疑join()这个函数有BUG,因为按JAVA文档的说法join是可以控制线程顺序且没有什么条件。显然事实上不是我代码已经说明了这点,因为只有将上述代码上的sleep的注释去掉,join()才起作用。也就是说join()如果要在循环体中起作用,必须让在循环体中加sleep.这才是我想与大家论的
tl.join();
我测试时,程序在第一次循环时,t1线程有时先输出,(比主线程main). 有时是main先输出“1”。这个是不定的。(与sleep没有绝对的关系)。
以后的循环,都是main先输出“1”。之后主线程等待,t1线程执行完。输出都是一样的,我测试10次以上,都是如下的:1
我是左手线程
我是左手线程
我是左手线程
我是左手线程
2
我是主线程
我是主线程
我是右手线程
我是右手线程
我是右手线程
我是右手线程
我是主线程
3
4我的意思是楼主看到的结果 与sleep没有关系。
不过个也算是一个经验:“显示出来不一定是真实的”
感谢'nmyangym'、‘LogicTeamLeader’,别的人显然没有明白我的意思
只有单核的电脑运行结果才会如java中所讲的那样。如果电脑是多核的,那就会多个线程一起执行,就算sleep了一个线程,其他线程也不一定会阻塞在那里。