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

如果把Stage类中的armyTaskOfSuiDynasty和armyTaskOfRevolt对keepRunning的修改注释掉第二个,根据volatile的实现原理,第一个对象对keepRunning的修改并把最新值刷入内存中,为什么armyOfRevolt没有读取到最新值,还是读取了自己对象内的值false。使得不能停止armyOfRevolt线程。

package com.concurrent.base;
//军队线程模拟作战双方的行为
public class ArmyRunnable implements Runnable{
    //volatile保证了线程可以正确的去读取其它线程写入的值。
    //可见性。当前类及其同包中的类。
    volatile boolean keepRunning=true;

    @Override
    
    public void run(){
        while(keepRunning){
            //发动5连击
            for(int i=0;i<5;i++){
                System.out.println(Thread.currentThread().getName()+"进攻对方["+i+"]");
                //让出了处理器时间
                Thread.yield();
            }
        }
        System.out.println(Thread.currentThread().getName()+"结束了战斗!");
    }
}


package com.concurrent.base;

public class Stage extends Thread {

    public void run(){
        
        System.out.println("欢迎观看隋唐演义");
        
        
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        
        System.out.println("大幕徐徐拉开");
        
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        System.out.println("话说隋朝末年,隋军和农民起义军杀得天昏地暗");
        ArmyRunnable armyTaskOfSuiDynasty=new ArmyRunnable();//定义了4个对象
        ArmyRunnable armyTaskOfRevolt=new ArmyRunnable();
        
        //使用Runnable接口创建线程
        Thread armyOfSuiDynasty=new Thread(armyTaskOfSuiDynasty,"隋军");
        Thread armyOfRevolt=new Thread(armyTaskOfRevolt,"农民起义军");
        
        
        //启动线程,让军队开始作战
        armyOfSuiDynasty.start();
        armyOfRevolt.start();
        
        //舞台线程休眠,大家专心观看军队的厮杀。
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        armyTaskOfSuiDynasty.keepRunning=false;
        armyTaskOfRevolt.keepRunning=false;
//        armyOfSuiDynasty.stop();
//        armyOfRevolt.stop();
        
        try {
            armyOfRevolt.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("正当双发激战正酣,半路杀出了个程咬金");
        
        Thread mrCheng=new KeyPersonThread();
        mrCheng.setName("程咬金");
        System.out.println("程咬金的理想就是结束战争,使百姓安居乐业!");
        
        //停止线程
        armyTaskOfSuiDynasty.keepRunning=false;
        armyTaskOfRevolt.keepRunning=false;
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mrCheng.start();
        
        try {
            mrCheng.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }//
        System.out.println("战争结束,人民安居乐业,程先生实现了积极的人生梦想,为人民做出了贡献");//这语句也被当作线程来处理。当
        //注释掉mrCheng.join代码块时,这两个线程先得到执行。后再执行mrCheng.start()语句//调用存在执行时间
        System.out.println("谢谢观看隋唐演义,再见!");
    }
    public static void main(String[] args) {
        Stage demo=new Stage();
        demo.start();
        
    }

}


正在回答

举报

0/150
提交
取消

如果把Stage类中的armyTaskOfSuiDynasty和armyTaskOfRevolt对keepRunning的修改注释掉第二个,根据volatile的实现原理,第一个对象对keepRunning的修改并把最新值刷入内存中,为什么armyOfRevolt没有读取到最新值,还是读取了自己对象内的值false。使得不能停止armyOfRevolt线程。

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

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

帮助反馈 APP下载

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

公众号

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