为了账号安全,请及时绑定邮箱和手机立即绑定

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

http://img1.sycdn.imooc.com//5962107a0001dd9405950660.jpg

正在回答

1 回答

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

1 回复 有任何疑惑可以回复我~
#1

秦家小小神 提问者

不是顺序问题,我想问的是join方法的作用不是Waits for this thread to die吗?怎么可能让别的线程插队?也就是说,只要使用join方法的线程开启了,那它就不会被插队,难道我理解错了?
2017-07-10 回复 有任何疑惑可以回复我~
#2

慕数据4042892 回复 秦家小小神 提问者

t.join()方法阻塞调用此方法的线程(calling thread),直到线程t完成,此线程再继续。是舞台线程调用了hero线程,所以只有舞台线程会停下来等hero线程结束再运行,而军队线程和hero没直接关联。
2017-08-24 回复 有任何疑惑可以回复我~
#3

慕瓜7073846 回复 慕数据4042892

舞台休眠的作用是什么?是不是为了让红蓝双方在这段休眠时间中厮杀,也就是说休眠一段时间再执行keepRunning=false,结束双方战斗线程。
2018-04-17 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号