大家看看为什么是死循环

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

greenhandc

2015-12-18 11:06

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回答

  • 乔小欠儿
    2015-12-18 12:01:35
    已采纳

    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("感谢观看隋唐演义!");
    
    
            }
        }


    乔小欠儿 回复greenh...

    我没看那个视频,我也不太清楚老师的需求是什么,但不管老师的需求是什么,join农民之前必须要让农民的run方法能执行完,这样才能不会发生死锁

    2015-12-18 12:34:55

    共 2 条回复 >

  • greenhandc
    2015-12-18 11:45:44
    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()+"结束了战斗!");
    	}


  • 乔小欠儿
    2015-12-18 11:29:40

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

  • greenhandc
    2015-12-18 11:22:26
    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()+"停止攻击");
             
     
        }
     
    }


  • 乔小欠儿
    2015-12-18 11:20:07

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

深入浅出Java多线程

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

186088 学习 · 464 问题

查看课程

相似问题