我自己试验了下,如果sleep时间过短,会导致join后还是被插队。求解!
package thread;
/**
* 军演舞台
*/
public class Stage extends Thread{
@Override
public void run() {
//创建红蓝方攻击的实例
ArmyRunnable redAttack0 = new ArmyRunnable();
ArmyRunnable blueAttack0 = new ArmyRunnable();
//创建线程
Thread redAttack = new Thread(redAttack0,"红方军团");
Thread blueAttack = new Thread(blueAttack0,"蓝方军团");
//军演战斗的帷幕徐徐拉开
System.out.println("军演战斗的序幕徐徐拉开······");
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//启动线程,开始作战
redAttack.start();
blueAttack.start();
//关闭舞台线程,保证军演专心进行一会儿。否则程咬金会提前登场!
//同时sleep时间太短(比如休眠25ms)会导致军团线程插入程咬金线程,为什么?????????????????????
try {
// this.sleep(50);//这种方法也可以,或者Thread.sleep(50)
sleep(50);//简写.
} catch (InterruptedException e) {
e.printStackTrace();
}
//半路杀出个Hero!
System.out.println("半路杀出个程咬金!");
//创建英雄程咬金线程,并开启
Hero hero = new Hero();
Thread chengyj = new Thread(hero,"程咬金");
chengyj.start();
try {
chengyj.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//结束两个军团线程,需要最后一遍循环结束
redAttack0.keepRunning=false;
blueAttack0.keepRunning=false;
//给两个军团线程结束一点儿时间
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("军演结束!");
}
public static void main(String[] args) {
//启动舞台,开始观战
new Stage().start();
}
}第一次sleep时,50ms可以保证不被插队,但是25ms就会出现下图所示:
