Ingsuifon 2020-02-07 22:24 采纳率: 0%
浏览 253
已采纳

关于线程终止后还执行的问题

我想通过外部标识符终止线程的执行,然而发现几个奇怪的地方。

public class TerminateThread implements Runnable {
        //1、外部标识
    private boolean flag = true;
    private String name;

    public TerminateThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        int i = 0;
        //2、关联标识,true-->运行 -->false停止
        while (flag) {
            System.out.println(name + "-->" + i++);
        }
    }

    //3、对外提供方法改变标识
    public void terminate() {
        this.flag = false;
    }

    public static void main(String[] args) {
        TerminateThread tt = new TerminateThread("C罗");
        new Thread(tt).start();

        for(int i = 0; i <= 99; i++) {
            if(i == 88) {
                tt.terminate();
                System.out.println("tt gameover");
            }
            System.out.println("main-->" + i);
        }
    }
}

图片说明

这个程序运行下来大部分是在打完了main-->99后又打印了C罗-->0,但是这个时候flag应该为false了呀。
还有一些奇怪的地方,比如run方法里打印的那行代码,如果我不打印name那么程序执行的结果就正常了,至少不会在flag为false后还打印,而且terminate函数里我一开始写的没有this关键字,我发现这个会影响结果,求教

  • 写回答

1条回答 默认 最新

  • 毕小宝 博客专家认证 2020-02-08 09:36
    关注

    这个问题并不奇怪,因为 flag 是普通变量,mian 线程修改该变量值后,它并没有立即被 tt 线程知道,就是所谓的数据读取延迟。
    修改下代码:

    private volatile boolean flag = true;
    

    volatile 可以保证变量的可见性,一单改变,所有的线程都能立即知道了。

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

报告相同问题?

悬赏问题

  • ¥15 arduino控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥85 maple软件,solve求反函数,出现rootof怎么办?
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题