我自己试验了下,如果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就会出现下图所示: