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();可以正常暂停 开始

涉及到线程安全问题,可以在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;等 仍然会出现程序一直处于暂停状态。