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

大家看看为什么是死循环

package com.currentcount.base;
/**
 * 搭建了舞台线程
 * 
 *
 */
public class Stage extends Thread {
	//复写run方法
	public void run(){
		System.out.println("欢迎观看隋唐演义!");
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e2) {
			
			e2.printStackTrace();
		}
		System.out.println("大幕徐徐拉开");
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		System.out.println("话说隋朝末年,各路藩王和隋军杀的是昏天黑地");
		ArmyRunnable armyTaskOfSuiDynasty=new ArmyRunnable();
		ArmyRunnable armyTaskOfFarmer=new ArmyRunnable();
		
		//使用Runnable创建线程
		Thread armyOfSuiDynasty=new Thread(armyTaskOfSuiDynasty,"隋朝军队");
		Thread armyOfFarmer=new Thread(armyTaskOfFarmer,"农民军队");
		
		//线程的运行
		armyOfSuiDynasty.start();
		armyOfFarmer.start();
		//让舞台线程休眠,大家能够专心观看军队的厮杀
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			
			e.printStackTrace();}
			
			try {
				armyOfFarmer.join();
			} catch (InterruptedException e1) {
				
				e1.printStackTrace();
			}
			
			System.out.println("正当双方激战正酣,半路杀出了个程咬金");
			Thread Chengyaojin=new KeypersonThread();
			Chengyaojin.setName("程咬金");
			System.out.println("程咬金的理想就是结束战斗,使得百姓安居乐业");
			//军队停止战斗
			armyTaskOfSuiDynasty.keepRunning=false;
			armyTaskOfFarmer.keepRunning=false;
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			Chengyaojin.start();
			//所有线程等待程咬金完成自己的历史使命
			try {
				Chengyaojin.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			System.out.println("程咬金完成了自己的理想,结束了战斗,使得人民能够安居乐业");
			System.out.println("感谢观看隋唐演义!");
		
		
				
				
		
	}
	


正在回答

代码语言

5 回答

Stage的run方法里有armyOfFarmer.join();这句。这句的意思是说农民的run方法执行完了才能往armyOfFarmer.join();这句代码之后运行。但你看看你的ArmyRunnable的run方法里,while (keepRunning)的keepRuning一直是true,while循环没有被终止。所以发生了死锁。

把Stage的run方法里的armyTaskOfFarmer.keepRunning=false;这句代码修改到armyOfFarmer.join();这句代码之前,就不会发生死锁了。

下面是我修改之后的代码

public class Stage extends Thread {
        //复写run方法
        public void run() {
            System.out.println("欢迎观看隋唐演义!");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e2) {

                e2.printStackTrace();
            }
            System.out.println("大幕徐徐拉开");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }
            System.out.println("话说隋朝末年,各路藩王和隋军杀的是昏天黑地");
            ArmyRunnable armyTaskOfSuiDynasty = new ArmyRunnable();
            ArmyRunnable armyTaskOfFarmer = new ArmyRunnable();

            //使用Runnable创建线程
            armyOfSuiDynasty = new Thread(armyTaskOfSuiDynasty, "隋朝军队");
            armyOfFarmer = new Thread(armyTaskOfFarmer, "农民军队");

            //线程的运行
            armyOfSuiDynasty.start();
            armyOfFarmer.start();
            //让舞台线程休眠,大家能够专心观看军队的厮杀
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {

                e.printStackTrace();
            }

            try {
                armyTaskOfFarmer.keepRunning = false;//这行代码提前!!!!
                armyOfFarmer.join();
            } catch (InterruptedException e1) {

                e1.printStackTrace();
            }

            System.out.println("正当双方激战正酣,半路杀出了个程咬金");
            Thread Chengyaojin = new KeypersonThread();
            Chengyaojin.setName("程咬金");
            System.out.println("程咬金的理想就是结束战斗,使得百姓安居乐业");
            //军队停止战斗
            armyTaskOfSuiDynasty.keepRunning = false;
//            armyTaskOfFarmer.keepRunning = false;
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            Chengyaojin.start();
            //所有线程等待程咬金完成自己的历史使命
            try {
                Chengyaojin.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            System.out.println("程咬金完成了自己的理想,结束了战斗,使得人民能够安居乐业");
            System.out.println("感谢观看隋唐演义!");


        }
    }


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

greenhandc 提问者

thank you~不过老师为什么要加上jion农民啊
2015-12-18 回复 有任何疑惑可以回复我~
#2

乔小欠儿 回复 greenhandc 提问者

我没看那个视频,我也不太清楚老师的需求是什么,但不管老师的需求是什么,join农民之前必须要让农民的run方法能执行完,这样才能不会发生死锁
2015-12-18 回复 有任何疑惑可以回复我~
public class KeypersonThread extends Thread{
	
	public void run(){
		System.out.println(Thread.currentThread().getName()+"开始了战斗!");
		for(int i=0;i<10;i++){
			System.out.println(Thread.currentThread().getName()+"左突右杀,攻击了隋军");
		}
		
		
		
		
		System.out.println(Thread.currentThread().getName()+"结束了战斗!");
	}


0 回复 有任何疑惑可以回复我~

没注意还有个这个KeypersonThread...这个里面是什么啊

0 回复 有任何疑惑可以回复我~
public class ArmyRunnable implements Runnable {
    //这里使用volatile保证线程可以正确的读取其他线程写入的值
    volatile boolean keepRunning=true ;
 
    //军队线程
    //用来模拟作战
    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()+"停止攻击");
         
 
    }
 
}


0 回复 有任何疑惑可以回复我~

ArmyRunnable这个Runnable里面写的是什么啊

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

大家看看为什么是死循环

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信