Java并发编程(二)线程任务的中断(interrupt)
使用interrupt()中断线程
当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。
package com.csdhsm.concurrent; import java.util.concurrent.TimeUnit; /**
* @Title: InterruptDemo.java
* @Package: com.csdhsm.concurrent
* @Description 中断Demo
* @author Han
* @date 2016-4-18 下午6:55:00
* @version V1.0
*/ public class InterruptDemo implements Runnable { @Override
public void run() { System.out.println("The thread is runing.");
System.out.println("The thread is sleeping.");
try { //子线程休眠20秒,等待被打断
TimeUnit.SECONDS.sleep(20);
System.out.println("The thread is wake up");
} catch (InterruptedException e) { System.out.println("The thread is interrupted");
} //此处会继续执行下去
System.out.println("The thread is terminal");
} public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new InterruptDemo());
t.start(); System.out.println("The Main is sleeping to wait the thread start!");
//主线程休眠2秒,等待子线程运行
TimeUnit.SECONDS.sleep(2); System.out.println("The thread would be interrupted");
t.interrupt();
}
}
结果

特别要注意的是标红的地方:如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。
使用isInterrupted()方法判断中断状态
可以在Thread对象上调用isInterrupted()方法来检查任何线程的中断状态。这里需要注意:线程一旦被中断,isInterrupted()方法便会返回true,而一旦sleep()方法抛出异常,它将清空中断标志,此时isInterrupted()方法将返回false。
package com.csdhsm.concurrent; import java.util.concurrent.TimeUnit; /**
* @Title: InterruptedCheck.java
* @Package: com.csdhsm.concurrent
* @Description Interrupted 测试
* @author Han
* @date 2016-4-18 下午7:44:12
* @version V1.0
*/ public class InterruptedCheck { public static void main(String[] args) { Thread t = Thread.currentThread(); System.out.println("Current Thread`s statusA is " + t.isInterrupted());
//自己中断自己~
t.interrupt();
System.out.println("Current Thread`s statusC is " + t.isInterrupted());
System.out.println("Current Thread`s statusB is " + t.isInterrupted()); try { TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) { System.out.println("Current Thread`s statusD is " + t.isInterrupted());
} System.out.println("Current Thread`s statusE is " + t.isInterrupted());
}
}
结果

使用interrupted()方法判断中断状态
可以使用Thread.interrupted()方法来检查当前线程的中断状态(并隐式重置为false)。又由于它是静态方法,因此不能在特定的线程上使用,而只能报告调用它的线程的中断状态,如果线程被中断,而且中断状态尚不清楚,那么,这个方法返回true。与isInterrupted()不同,它将自动重置中断状态为false,第二次调用Thread.interrupted()方法,总是返回false,除非中断了线程。
package com.csdhsm.concurrent; /**
* @Title: InterruptedCheck.java
* @Package: com.csdhsm.concurrent
* @Description Interrupted 测试
* @author Han
* @date 2016-4-18 下午7:44:12
* @version V1.0
*/ public class InterruptedCheck { public static void main(String[] args) { Thread t = Thread.currentThread(); System.out.println("Current Thread`s statusA is " + t.interrupted());
//自己中断自己~
t.interrupt();
System.out.println("Current Thread`s statusC is " + t.interrupted());
System.out.println("Current Thread`s statusB is " + t.interrupted());
System.out.println("Current Thread`s statusD is " + t.interrupted());
}
}
结果

注意看红色的标记
Java并发编程(二)线程任务的中断(interrupt)的更多相关文章
- Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发编程二三事
Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...
- Java并发编程:线程池的使用(转)
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发编程:线程池的使用(转载)
转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- Java并发编程:线程池的使用(转载)
文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- [转]Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- 【转】Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- 13、Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- Java并发编程:线程控制
在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期.这篇文章将深入讲解Java如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态 ...
随机推荐
- Could not obtain connection metadata
用hibernate连接数据库出现错误 2010-3-16 17:23:39, 093 [main] WARN [org.hibernate.cfg.SettingsFactory] - Could ...
- String.join()方法的使用
String.join()方法是JDK1.8之后新增的一个静态方法,使用方式如下所示: String result = String.join("-","java&qu ...
- Spring MVC 之请求处理方法可接收参数(三)
请求处理方法可接收参数 今天学习了前三个方法. 1.作用域对象2.单个表单提交数据3.表单数据封装的Bean对象 首先创建一个实体对象. package com.cy.springannotation ...
- jQuery中对属性的增删改查
获取元素的属性 $('input').attr('type') .attr() 可以获取和设置自定义属性 .prop() 只能获取和设置固有属性 在设置属性值时 建议不要修改type属性,有的浏览 ...
- php学习记录 易混淆
1.echo和print的区别 PHP中echo和print的功能基本相同(输出),但是两者之间还是有细微差别的.echo输出后没有返回值,但print有返回值,当其执行失败时返回flase.因此可以 ...
- 循环效率对比 js node c# mssql
- 20145218 《Java程序设计》第05次实验报告
北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验名称:Java网络编程及安全 一.实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使 ...
- css3做的动画
基于放大缩小: http://www.credero.etall.cn/demo/jwtplay/3/content05.html 基于3d: http://www.credero.etall.cn/ ...
- IO流--字节流
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import ...
- Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...