「美好,一直在身边」震惊!这样终止线程,竟然会导致服务宕机?( 四 )



1.自定义退出标识我们可以自定义一个布尔变量来标识是否需要退出线程 , 实现代码如下:
// 自定义退出标识退出线程static class FlagThread extends Thread { public volatile boolean exit = false; public void run { while (!exit) { // 执行正常的业务逻辑 } } } 可以看出我们使用了关键字 volatile 对线程进行了修饰 , 这样就可以保证多线程的执行安全了 , 在我们需要让线程退出时 , 只需要把变量 exit 赋值为true 就可以了 。
2.interrupt 终止线程当我们使用 interrupt 方法时 , 以上两个示例的执行结果就正常了 , 执行代码如下:
public class ThreadStopExample { public static void main(String[] args) throws InterruptedException { // 问题一:破坏了程序的完整性 Thread t1 = new Thread( -> { try { System.out.println("子线程开始执行"); // 模拟业务处理 Thread.sleep(1000); } catch (Exception e) { } // 伪代码:重要业务方法 System.out.println("子线程的重要业务方法"); }); t1.start; // 让子线程先运行一点业务 Thread.sleep(100); // 终止子线程 t1.interrupt; // 等待一段时间 , 确保子线程“执行完” Thread.sleep(3000); System.out.println("主线程执行完成"); // 问题二:破坏了原子逻辑 MyThread myThread = new MyThread; Thread t2 = new Thread(myThread); // 开启线程 t2.start; for (int i = 0; i < 10; i++) { Thread t = new Thread(myThread); t.start; } // 结束线程 t2.interrupt; } /** * 自定义原子测试线程 */ static class MyThread implements Runnable { // 计数器 int num = 0; @Override public void run { // 同步代码块 , 保证原子操作 synchronized (MyThread.class) { // 自增 num++; try { // 线程休眠 0.1 秒 Thread.sleep(100); } catch (InterruptedException e) { System.out.println(e.getMessage); } // 自减 num--; System.out.println(Thread.currentThread.getName + " | num=" + num); } } }} 以上程序的执行结果为:
子线程开始执行
子线程的重要业务方法
主线程执行完成
sleep interrupted
Thread-1 | num=0
Thread-9 | num=0
Thread-10 | num=0
Thread-7 | num=0
Thread-6 | num=0
Thread-5 | num=0
Thread-4 | num=0
Thread-2 | num=0
Thread-3 | num=0
Thread-11 | num=0
Thread-8 | num=0
可以看出以上的执行都符合我们的预期 , 这才是正确的终止线程的方式 。
「美好,一直在身边」震惊!这样终止线程,竟然会导致服务宕机?


推荐阅读