我自己试验了下,如果sleep时间过短,会导致join后还是被插队。求解!

来源:2-5 Java线程-隋唐演义实战开发---关键先生

秦家小小神

2017-07-09 19:16

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就会出现下图所示:

http://img.mukewang.com/5962107a0001dd9405950660.jpg

写回答 关注

1回答

  • lambLHB
    2017-07-10 16:56:58

    你代码顺序错了,应该先停止双方线程,然后再让关键线程运行。

    慕瓜7073... 回复慕数据404...

    舞台休眠的作用是什么?是不是为了让红蓝双方在这段休眠时间中厮杀,也就是说休眠一段时间再执行keepRunning=false,结束双方战斗线程。

    2018-04-17 15:52:13

    共 3 条回复 >

深入浅出Java多线程

带你一起深入浅出多线程,掌握基础,展望进阶路线

186064 学习 · 502 问题

查看课程

相似问题