Kevin玩IT 2014-11-29 19:10 采纳率: 100%
浏览 2106
已采纳

java线程没有响应,像是暂停了一样

简单地来说,就是有两个线程A和B,在main函数里面先后启动他们
线程A的run函数里面有一个while循环,循环体里主要是一句if,判断的是一个存在于A里面的一个布尔变量boo,如果是true就输出一句话,但boo在初始化的时候就已经设置为false
线程B在接收了一次输入之后,再把线程A里面的boo改成true,仅此而已。
现在问题来了,线程A始终没有输出,相当于线程A暂停了(线程A并没有被杀死),求解呀...
更加奇怪的是,如果使用debug模式,程序是可以正常运行的,这又是为什么呢?
代码如下:

public class ThreadA extends Thread{
    public boolean boo;
    public ThreadA() {
        boo = false;
    }
    public void run() {
        while (true) {
            if (boo) {
                System.out.println("boo equals ture now!");
                boo = false;
            }
        }
    }
}

public class ThreadB extends Thread{
    private ThreadA a;
    public ThreadB(ThreadA a) {
        this.a = a;
    }
    public void run() {
        try {
            int num = System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
        a.boo = true;
    }
}

public class MainFunc {
    public static void main(String[] args) {
        ThreadA a = new ThreadA();
        ThreadB b = new ThreadB(a);
        a.start();
        b.start();
    }
}
  • 写回答

4条回答

  • Coursera 2014-11-29 21:29
    关注

    这是基本的java程序错误,请把boo改成volatile。:-D.
    至于为什么,请参考jls

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器