这问题也是很常见的问题,自打 stop不推荐使用后,我们还有别的可以选择的方法吗?
设置一个标志,让其自动return最安全。
设置一个标志,让其自动return最安全。
- /**
- * JAVA里面如何使用一个线程死亡或结束.
- * @author 赵学庆,Java世纪网(java2000.net)
- *
- */
- public class T {
- public static void main(String[] args) {
- // 启动线程
- MyThread thread = new MyThread();
- new Thread(thread).start();
-
- // 你的其它的工作,此时线程在运行中
-
- // 你不想让线程干活了,停掉它
- // 注意,这只是一个标志,具体线程何时停,并不能精确控制
- thread.allDone = true;
-
- }
-
- }
-
- class MyThread implements Runnable {
- boolean volatile allDone = false;
-
- public void run() {
- // 每次循环都检测标志
- // 如果设置停止标志时已经在循环里
- // 则最长需要等待一个循环的时间才能终止
- while (!allDone) {
- // 循环里的工作
- }
- }
- }
修正,增加了 volatile 关键字,避免多个CPU出问题。
转自:老紫竹的博客
自我补充:volatile 关键字介绍
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。