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如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态 ...
随机推荐
- iOS开发之如何修改Mac截屏保存路径
如何修改Mac截屏保存路径 MAC OS X系统默认的截图路径是桌面文件夹,默认的截图格式是 PNG 图片格式,如何自定义设置呢? 截图保存路径 打开终端(Terminal)并输入如下命令: de ...
- DOM加载:浏览器渲染和操作顺序(转载 学习中。。。)
DOM加载:浏览器渲染和操作顺序 1.HTML解析完毕 2.外部脚本和样式表加载完毕 3.脚本在文档内解析并执行 4.HTML DOM完全构造起来 5.图片和外部内容加载 6.网页完成加载 基于这个顺 ...
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?m ...
- hiho_1048_状态压缩2
题目大意 用1x2的单元拼接出 NxM的矩形,单元可以横放或者纵放,N < 1000, M <= 5. 求不同的拼接方案总数. 分析 计算机解决问题的基本思路:搜索状态空间.如果采用dfs ...
- eclips引入Java源代码
window->>preferences->>Java->Installed JRES 如图所示 这是中文本的 点击“Installed JRES”选择如下图所示的jdk ...
- Java并发编程:并发容器之ConcurrentHashMap
转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...
- HTTP协议中PUT和POST使用区别 【转载】
有的观点认为,应该用 POST来创建一个资源,用PUT来更新一个资源:有的观点认为,应该用PUT来创建一个资源,用POST来更新一个资源:还有的观点认为可以用PUT和 POST中任何一个来做创建或者更 ...
- Git从远程分支创建本地分支
git fetch origin master:temp 这句命令的意思是:将远程origin仓库的master分支下载到本地,并新建一个分支temp.
- 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。解决办法
找到使用中的程序池,右键,设置应用程序默认设置,如下 确定即可.
- win7_oracle11g_64位连接32位PLSQL_Developer
工具/原料 已经装好的64位Oracle数据库 window7_64位的操作系统 PLSQL_Developer 9.0以上版本(目前只有32位的):下面有下载连接! 官方的 instantcli ...