bluehabi 2022-10-16 11:21 采纳率: 0%
浏览 35

java 摸你线程 暂停 会直接挂掉

线程 在 while 循环中 执行 continue的时候会 结束

public class Test {

static  boolean pause ;
public static void main(String[] args) {

    test();
    test2();


}
//模拟程序的执行
public static  void test(){
    Thread thread2 = new Thread(new Runnable() {
        @Override
        public void run() {

            while (true) {
                //System.out.println("暂停了吗");

                if(pause){//如果 if之前没有 语句执行  该 进程会 结束
                    continue;
                }
                 try {
                    //暂停操作

                    //游戏等级控制
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("程序执行++++++++++++++++++++++++++++++++++++++++");

            }

        }
    });
    thread2.start();

}

//摸你程序的暂停
public static void test2(){
    Thread thread3 = new Thread(new Runnable() {
        @Override
        public void run() {

            while (true) {

                try {
                    //暂停操作

                    //游戏等级控制
                    Thread.sleep(5000);//5秒就 暂停一下
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                pause=!pause;

            }

        }
    });
    thread3.start();

}

}

当 pause = TRUE test(); 就挂了

给if 前面加个语句就可以
test();可以正常暂停 开始

  • 写回答

1条回答 默认 最新

  • Ewen Seong Java领域新星创作者 2022-10-18 14:39
    关注

    涉及到线程安全问题,可以在pause上添加一个volatile;
    具体分析如下:
    (1) 表现:
    test()方法中,pause一直处于true状态,导致一至从continue退出而无法向下执行;
    (2) 原因:
    test()方法中的线程thread2第一次从全局static变量pause取到false时,会往下执行— —会执行System.out.println语句(会导致刷新线程的缓存)
    当test2()方法将pause修改为true时,test()方法由于刷新缓存——会在某个时刻取出true,并存入到自己的工作空间(每个线程有自己的工作空间,缓存),后面因为不会再次尝试从内存中获取pause的值,而直接从自己线程的工作空间中获取,从而得到的pause一直为true;

    另外,再说一下“给if 前面加个语句就可以”, 也不是加所有语句都可以;加上System.out.println会导致线程刷新自己的工作空间,所以会重新从内存中取值;
    如果加上类似: int a=0 ; a=a+1;等 仍然会出现程序一直处于暂停状态。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月16日

悬赏问题

  • ¥20 ESP32使用MicroPyhon开发,怎么获取485温湿度的值,温湿度计使用的鞋子是Modbus RTU
  • ¥50 苹果MGIE项目部署缺少emb权重
  • ¥15 采用ansys进行机翼在特定路径下的打孔过程中的受力分析
  • ¥15 单片机adb主机连接手机,usb调试密钥无法保存
  • ¥15 已知X和Y有以下关系,求X和Y的关系式
  • ¥15 net core 同时编辑怎么防止数据多保存了
  • ¥15 matlab做ba模型让其在ba和er规则下生长
  • ¥15 请问Quartus的Verilog代码怎么写?
  • ¥100 Mac 版foxmail 收邮件问题
  • ¥15 QWebEngineView