Java中的线程中断:interrupt()、interrupted()和isInterrupted
2015-10-25 20:51
761 查看
使用interrupt()中断线程
当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。
下面一段代码演示了休眠线程的中断:
package com.wrh.threadInterrupt; public class ThreadInterrupt implements Runnable{ public static void main(String[] args) { //开启一个线程 ThreadInterrupt runnable=new ThreadInterrupt(); Thread t=new Thread(runnable); t.start(); try { Thread.sleep(5000);//使main线程休息会,让子线程有时间运行会。 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //中断子线程 System.out.println("main ----即将中断子线程"); t.interrupt(); System.out.println("main-----main线程运行结束结束"); } @Override public void run() { System.out.println("run----子线程正在运行"); try { Thread.sleep(20000);//子线程休息20秒,等待main线程来终端 } catch (InterruptedException e) { // TODO Auto-generated catch block System.out.println("run-----子线程在休息的时候被中断"); return;//如果没有return,则即使线程中断也不会立即返回,他还会继续运行下面的代码 } System.out.println("run-------子线程运行结束"); } }
上面的逻辑很清楚,这里就不在解释。
运行结果如下
run—-子线程正在运行
main —-即将中断子线程
main—–main线程运行结束结束
run—–子线程在休息的时候被中断
这里要说明的是:由于不确定的线程规划,程序中后面两条语句的输出顺序可能相反。
待决中断
在上面的例子中,线程在执行sleep()方法休眠时被其它线程中断,它会相当友好地终止线程,并抛出InterruptedException异常。另外一种情况,如果线程在调用sleep()方法前被中断,那么该中断称为待决中断,它会在刚调用sleep()方法时,立即抛出InterruptedException异常。package com.wrh.threadInterrupt; public class PendingInterrupt { private static boolean flag; public static void main(String[] args) { flag=true; if(flag){ Thread.currentThread().interrupt();//中断当前线程 } long curTime=System.currentTimeMillis(); try {//当前线程休眠20秒 System.out.println("当前线程即将sleep的前一条语句"); Thread.sleep(20000); System.out.println("程序没有被中断"); } catch (InterruptedException e) { // TODO Auto-generated catch block System.out.println("程序被中断"); } System.out.println("程序运行的时间:"+(System.currentTimeMillis()-curTime)); } } /* * 当falg=false时 * 输出: 当前线程即将sleep的前一条语句 * 程序没有被中断 程序运行的时间:20000 当flag=true时 输出:当前线程即将sleep的前一条语句 程序被中断 程序运行的时间:0 * */
有的人可能会有这样的译文:main线程中断了,它怎么还在继续运行呀?
原因是:在catch块中没有return,因此,只用interrupt()是无法立即中断线程的,它还会继续往下面运行。
Thread.interrupted()来判断当前线程是否中断
可以使用Thread.interrupted()方法来检查当前线程的是否中断(并隐式重置为false)。又由于它是静态方法,因此不能在特定的线程上使用,而只能报告调用它的线程的中断状态,如果线程被中断,而且中断状态尚不清楚,那么,这个方法返回true。与isInterrupted()不同,它将自动重置中断状态为false,第二次调用Thread.interrupted()方法,总是返回false,除非中断了线程。package com.wrh.threadInterrupt; public class ThreadInterrupted { public static void main(String[] args) { System.out.println("A点:Thread.interruped()的结果为"+Thread.interrupted()); //线程中断 Thread.currentThread().interrupt(); System.out.println("B点:Thread.interruped()的结果为"+Thread.interrupted()); System.out.println("C点:Thread.interruped()的结果为"+Thread.interrupted()); } } /* * 运行结果: * A点:Thread.interruped()的结果为false B点:Thread.interruped()的结果为true C点:Thread.interruped()的结果为false * */
isInterrupted()来判断线程是否被中断
package com.wrh.threadInterrupt; //isInterrupt()方法的用法 public class ThreadIsInterrupt { public static void main(String[] args) { System.out.println("A点: Thread.currentThread().isInterrupted()="+Thread.currentThread().isInterrupted()); Thread.currentThread().interrupt();;//线程中断 System.out.println("B点: Thread.currentThread().isInterrupted()="+Thread.currentThread().isInterrupted()); System.out.println("C点: Thread.currentThread().isInterrupted()="+Thread.currentThread().isInterrupted()); } }
运行结果
A点: Thread.currentThread().isInterrupted()=false
B点: Thread.currentThread().isInterrupted()=true
C点: Thread.currentThread().isInterrupted()=true
从结果可以看出,当线程被中断后,Thread.currentThread().isInterrupted()的结果就被一直是ture,与interrupted()不一样,不会重置会false;这一点要区分开
相关文章推荐
- struts2 标签问题----escape="false" 这个属性
- Struts2中过滤器和拦截器的区别
- myeclipse在mac中字体模糊问题
- SSH学习--struts的action中BaseAction的作用
- [JavaWeb基础] 026.JAVA中使用Axis搭建webservice-环境搭建(一)
- java多线程之生产者消费者经典问题
- Java简介
- JAVA中的反射机制
- 再谈备忘录模式 (memento pattern) Java
- java作业04(动手动脑)
- 摘自<编写高质量代码:改善Java程序的151个建议>
- Spring MVC常用的注解
- Spring Data学习笔记-查询方法
- JAVA中的多线程
- java中开源日志记录工具log4j
- jre运行报Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
- [转]JBOSS4.3关于java.lang.OutOfMemoryError: PermGen space解决方法
- 5分钟用Spring4 搭建一个REST WebService(转)
- Myeclipse与mysql数据库的连接
- jdkWIN7环境配置