java多线程技术: interrupt() 中断线程, 优雅停止线程及原理
MyThread.class package cn.yilong.edcsapiservice.thread; public class MyThread extends Thread { @Override public void run() { System.out.println("开始睡觉"); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("结束睡觉"); synchronized (MyThread.class){ for (int i=0; i<100; i++){ System.out.print(i+","); } System.out.println(); String name = Thread.currentThread().getName(); System.out.println(name + ": " + this.isInterrupted()); System.out.println("test--------------------"); System.out.println(); } } } ? Run.class package cn.yilong.edcsapiservice.thread; public class Run2 { public static void main(String[] args) { Thread ct = Thread.currentThread(); ct.setName("mainThread"); try { MyThread t = new MyThread(); t.setName("myThread"); t.start(); t.interrupt(); // 如果t线程已经结束,再调中断方法,不做任何处理 synchronized (MyThread.class) { String name = Thread.currentThread().getName(); System.out.println(name + ": " + t.interrupted()); //虽然是t线程调用,但底层真正调用不是t,而是当前main方法的线程,执行实际操作是 Thread.currentThread().isInterrupted() 即mainThread线程 System.out.println(t.getName() + ": " + t.isInterrupted()); System.out.println("main-----------------------------"); System.out.println(); } } catch (Exception e) { System.out.println("main catch"); e.printStackTrace(); } } } ? ? mainThread: false 开始睡觉 ?
interrupt() 方法 interrupt()本质是 给调用该方法的线程做一个标记,这个标记默认初始值是: false,调用后变成: true,所以说,做标记并不能停止这个线程. 而废弃的stop()方法是直接停止这个线程. 这是根本区别. 线程对象调用interrupt()方法时,我们想中断这个线程,需要人为写逻辑进行中断,通常存在两种情况(实际还有其他,源码注释上有解释): 1. 线程状态:正在运行中,此时如果t线程调用了interrupt()方法,那么,t线程会立刻被做上标识: false变为true,(当然,如果t线程调用interrupt()前刚好正常执行结束了, (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |