SouthWind_ZK 2019-10-19 12:02 采纳率: 66.7%
浏览 258
已采纳

关于自定义中断标记问题

MyRunnable2.java

public class MyRunnable2 implements Runnable{
    public boolean flag = true;
    int i = 0;
    public MyRunnable2() {
        flag = true;
    }
    @Override
    public void run() {
        while(flag) {
            System.out.println(Thread.currentThread().getName() +"=="+(i++) + flag);

            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


    }

}






Test4.java

public class Test4 {
    public static void main(String[] args) {
        MyRunnable2 mr2 = new MyRunnable2();
        Thread t = new Thread(mr2);

        t.start();

        for (int i = 0; i < 50; i++) {
            System.out.println(Thread.currentThread().getName()+"-"+i);

            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (i ==20) {
                mr2.flag = false;

            }

        }
    }

}

在Test4.java中,主线程for循环到i为20的时候 mr2.flag设置为false,这样就可以控制t进程不再进行

图片说明

但是它运行了,而且flag还是false,虽然后面t进程被中断了。
我想问的是:为什么flag为flase它还可以运行一次

  • 写回答

1条回答 默认 最新

  • 毕小宝 博客专家认证 2019-10-19 12:10
    关注

    那是因为该变量的值发生变化的时候,另一个线程并没有立即得到最新的值,就是并发编程中的数据失效问题。
    把它定义为 public volatile boolan 类型的就可以了,它可以保证变量值立即被其他线程知晓。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题