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 类型的就可以了,它可以保证变量值立即被其他线程知晓。

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

报告相同问题?

悬赏问题

  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的