Java停止线程的方法 interrupt方法解析
解析下interrupt()方法,对于老鸟来说,新手遇到这样的问题简直笑而不语,
估计你们上学的时候老师也说的不好,根本没有具体的解析,我那个java老师就是这样的,汗!------
具体解析请看代码注释。。。。。。。
/** * 停止线程的方法 * @author aa * */ public class ThreadInterrupt { private volatile static boolean stop = false; /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { // 线程启动 Thread01 ti1 = new Thread01() ; ti1.start() ; // Main线程睡1秒 Thread.sleep(1000) ; /** * 程序运行到这里,ti线程已经启动,而且ti线程正在阻塞状态, * 屏蔽掉stop方法, * 调用interrupt()方法让线程退出阻塞状态,调用该方法线程将会抛出一个中断异常, * InterruptedException,终结阻塞状态之后,接着线程继续运行 * 如下你将会看到“线程阻塞终结之后输出”打印到控制台上 * * 总结:interrupt()是用来退出线程的阻塞状态,如果线程不是阻塞状态, * 调用该方法将不起任何作用,中文jdk说的是“中断线程”,从字面上理解会给人误导。(很怀疑是机器翻译) * wait(),join(),sleep()都会让线程阻塞 */ ti1.interrupt() ; System.out.println() ; // 线程启动 /** * 正确停止线程的方法是设置共享变量,无论什么情况,线程的退出都是检查共享变量然后停止 * * 不考虑意外情况, * 这里ti2线程start()后, * Mian线程休眠2.5秒过后并设置stop为true, * 此时ti2线程也就刚好是阻塞状态, * 设置stop之后继续执行interrupt()方法,终止阻塞, * 线程继续运行,遇到stop==true,跳出while,线程停止 */ Thread02 ti2 = new Thread02() ; ti2.start() ; Thread.sleep(2500) ; stop = true ; ti2.interrupt() ; Thread.sleep(1000) ; } private static class Thread01 extends Thread { @Override public void run() { System.out.println("Thread01线程启动") ; try { sleep(1000000) ; // 等待1000秒 } catch (InterruptedException e) { System.out.println("Thread01线程阻塞停止") ; } System.out.println("Thread01线程阻塞终结之后输出") ; } } private static class Thread02 extends Thread { @Override public void run() { System.out.println("Thread02线程启动") ; int i = 0 ; while(!stop) { System.out.println(i++) ; try { Thread.sleep(1000) ; } catch (InterruptedException e) { System.out.println("Thread02线程阻塞停止") ; } } } } }