## 9.31 停止任务 代码中的线程A启动后,主线程设置stop=true能停止吗? ~~~java public class Task { private static boolean stop = false; public static void main(String[] args){ Thread a = new Thread("A"){ public void run(){ while (!stop) { int a = 1; } System.out.println("exit"); } }; a.start(); pause(100); stop = true; } public static void pause(int time){ try { Thread.sleep(time); }catch(Exception ex){ } } } ~~~ 答案,这段代码是第三章并发的例子,例子通过stop变量来设置线程A是否停止。需要考虑多核情况下变量得可见性,因此需要使用volatile 关键字 ~~~java private static volatile boolean stop = false; ~~~ 如下方案是否能同样是的线程A停止呢? ```java Thread a = new Thread("A"){ public void run(){ while (!stop) { int a = 1; TimeUnit.MILLISECONDS.sleep(time); } System.out.println("exit"); } }; ``` 答案是能,因为线程休眠后再恢复,有上下文切换,能取得主内容最新变量 如下增加一个输出变量,是否能让线程A停止呢? ```java Thread a = new Thread("A"){ public void run(){ while (!stop) { int a = 1; System.out.println(stop); } System.out.println("exit"); } }; ``` 答案是能,因为println内部有个同个同步锁,调用后会有上下文切换,取得主内存变量。说以,看到有System.out.println不要轻易删除,本书另外有个地方也列举了电商代码因为删除System.out.println导致的系统故障