线程 在 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;等 仍然会出现程序一直处于暂停状态。