上QQ阅读APP看书,第一时间看更新
1.11.5 在sleep状态下停止
如果线程在sleep状态下,停止线程会是什么样的效果呢?
新建项目t14,类MyThread.java代码如下:
public class MyThread extends Thread { @Override public void run() { super.run(); try { System.out.println("run begin"); Thread.sleep(200000); System.out.println("run end"); } catch (InterruptedException e) { System.out.println("在沉睡中被停止!进入catch!"+this.isInterrupted()); e.printStackTrace(); } } }
文件Run.java代码如下:
public class Run { public static void main(String[] args) { try { MyThread thread = new MyThread(); thread.start(); Thread.sleep(200); thread.interrupt(); } catch (InterruptedException e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("end!"); } }
程序运行结果如图1-47所示。
图1-47 运行结果
从运行结果来看,如果线程在sleep状态下停止,则该线程会进入catch语句,并且清除停止状态值,变成false。
上述项目是先调用sleep(),再调用interrupt()方法停止,还有一个反操作在学习线程时也要注意,即先调用interrupt()方法,再调用sleep()方法,但这种方法也会出现异常。
新建项目t15,类MyThread.java代码如下:
public class MyThread extends Thread { @Override public void run() { super.run(); try { for(int i=0;i<100000;i++){ System.out.println("i="+(i+1)); } System.out.println("run begin"); Thread.sleep(200000); System.out.println("run end"); } catch (InterruptedException e) { System.out.println("先停止,再遇到了sleep!进入catch!"); e.printStackTrace(); } } }
类Run.java代码如下:
public class Run { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); thread.interrupt(); System.out.println("end!"); } }
程序执行结果如图1-48所示。
图1-48 打印end!说明interrupt方法先执行了
控制台最下面的输出如图1-49所示。
图1-49 先调用interrupt()方法停止后遇到sleep报异常
不管其调用顺序,只要interrupt()和sleep()方法碰到一起就会出现异常:
1)在sleep状态执行interrupt()方法会出现异常;
2)调用interrupt()给线程打了中断标记,再执行sleep()方法也会出现异常。