一:使用falg停止线程
- 创建继承Thread类的线程类MyThread.java
package com.kgf.test; public class MyThread extends Thread { private boolean flag = true; @Override public void run() { System.out.println("子线程运行开始==============="); int i = 1; while(flag) { try { Thread.sleep(1000); System.out.println(i+"次进入for循环!"); i++; } catch (Exception e) { e.printStackTrace(); } } } public void setFlag(boolean flag) { this.flag = flag; } }
- 创建测试类
package com.kgf.test; public class Run { public static void main(String[] args) throws InterruptedException { try { MyThread myThread = new MyThread(); Thread thread = new Thread(myThread,"子线程"); thread.start(); Thread.sleep(4000);//主线程4秒后会将thread1的falg置false,那么就会推出循环,子线程就会停止 myThread.setFlag(false); } catch (Exception e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("==========END================"); } }
- 效果
- 结果分析
首先根据逻辑,我们可知,首先我们是启动子线程后,main线程会睡眠4秒钟,4秒后,我们会修改
创建的MyThread对象中的flag变量的值,后面子线程就会退出循环。
二:用stop使线程停止----暴力停止
- 简介
使用stop()方法停止线程是非常暴力的,stop方法是过时的,从Java编码规则来说,
已经过时的方式不建议采用,stop方法会导致代码逻辑不完整,stop方法是一种"恶意" 的
中断,一旦执行stop方法,即终止当前正在运行的线程,不管线程逻辑是否完整,这是非常危险的,
stop方法会破坏原子逻辑。如果我们使用stop()方法强制让线程停止则有可能使一些清理性的
工作得不到完成。另外就是对锁定的对象进行了“解锁”,导致数据得不到同步的处理,出现数据
不一致的问题。 - 代码示例
⑴创建一个方法类SynchronizedObject.java
package com.kgf.test; public class SynchronizedObject { private String username = "a"; private String password = "aa"; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } /** *加上了synchronized同步锁 */ public synchronized void printString(String username,String password) { try { this.username = username; Thread.sleep(100000); this.password = password; } catch (Exception e) { e.printStackTrace(); } } }
⑵ 创建继承Thread类的MyThread.java类
package com.kgf.test; public class MyThread extends Thread { private SynchronizedObject object; public MyThread(SynchronizedObject object) { this.object = object; } @Override public void run() { object.printString("b", "bb"); } }
⑶创建测试类
package com.kgf.test; public class Run { public static void main(String[] args) throws InterruptedException { try { SynchronizedObject object = new SynchronizedObject(); MyThread thread = new MyThread(object); thread.start(); Thread.sleep(500); thread.stop(); System.out.println(object.getUsername()+" "+object.getPassword()); } catch (Exception e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("==========END================"); } }
⑷效果如下
⑸结果分析
由上图的结果可知,由于我们在程序的执行中使用stop()方法,造成了数据的不一致
性,破坏了程序的原子性,原本要么是a aa或者b bb,但是现在变成b aa这就导致了数据
的原子性了,可见stop()方法确实是存在缺陷的,所以不建议在程序中使用stop()方法。
三:用return使线程停止
- 简介
将方法interrupt()和return结合使用是可以实现停止线程的效果的,只不过我们
还是建议使用“抛异常”法来实现线程的停止,因为在catch快中可以对异常的信息进
行相关的处理,能够更好的控制流程的运行,不至于代码中出现很多个return,造成
污染。 - 代码示例
⑴创建继承Thread的类
⑵创建测试类
⑶ 效果