没有循环的内容,直接提示战斗结束了怎么回事?

来源:2-4 Java线程-隋唐演义实战开发---军队

秦家小小神

2017-07-06 00:56

public class ArmyRunnable implements Runnable {

	//volatile保证了线程可以正确的读取其他线程写入的值
	//可见性  JMM,happens-before原则??????????????????????????
	volatile boolean keepRunning;

	@Override
	public void run() {
		while(keepRunning){
			//发动五连击
			for(int i=0;i<5;i++){
				System.out.println(Thread.currentThread().getName()+"攻击对方【"+i+"】次!");
			}
			//让出处理器时间,让线程们“公平竞争”
			Thread.yield();
		}
		
		System.out.println(Thread.currentThread().getName()+"战斗结束了!");
	}

}
/**
 * 军演舞台
 */
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,"蓝方军团");
		//启动线程,开始作战
		redAttack.start();
		blueAttack.start();
		//关闭舞台线程,保证军演专心进行
		try {
//			this.sleep(50);
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//关闭线程,鸣金收兵
		redAttack0.keepRunning=false;
		blueAttack0.keepRunning=false;
		//保证蓝方运行结束????????????????????????
		try {
			blueAttack.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}
	
	public static void main(String[] args) {
		//启动舞台,开始观战
		new Stage().start();
	}

}


写回答 关注

1回答

  • hanshao533
    2017-07-06 10:43:15
    已采纳
    public class ArmyRunnable implements Runnable {
     
        //volatile保证了线程可以正确的读取其他线程写入的值
        //可见性  JMM,happens-before原则??????????????????????????
        volatile boolean keepRunning;//你这里没有赋值,默认是false,当然不会跑


    秦家小小神

    非常感谢!我自己看了好几遍都没发现。。

    2017-07-06 17:29:35

    共 1 条回复 >

深入浅出Java多线程

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

186088 学习 · 464 问题

查看课程

相似问题