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如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态 ...
随机推荐
- golang操作文件的四种方法
golang追加内容到文件末尾 字数349 阅读54 评论0 喜欢2 golang读写文件,网上很多教程了但是今天有个需求,想要把内容追加写到文件末尾google了好久,没有查到研究了一会儿file库 ...
- mac 下获取 os x 的系统版本,使用 oc cocoa
mac 下获取 os x 的系统版本,使用 oc cocoa 1: #import <CoreServices/CoreServices.h> SInt32 major, minor, b ...
- maven 添加支持编译jdk1.7
1.在<profiles>元素内增加如下内容 <profile> <id>jdk17</id> <activation> ...
- 垂直居中,水平居中html例子
<!DOCTYPE html> <html lang="en"> <head> <title>Vertical Centering ...
- 打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
- nyoj------20吝啬的国度
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市 ...
- ECC中的CRM UI端摆弄
前段时间想搞CRM了,可是公司没有环境,就去ECC直接试试事务码,结果竟然可以打开网页...兴奋之余又去看了一下CRM里的一些CLASS,结果很多都是没有的.沮丧! 后来想想,只能用UI的框架,挂WD ...
- 数据库索引<二> 补充前篇
你要准备的软件有: 最新版 Rsync for windows 服务端:cwRsync_Server_2.1.5_Installer.zip 客户端:cwRsync_2.1.5_Installer.z ...
- uva 1631
1631 Locker A password locker with N digits, each digit can be rotated to 0-9 circularly. You can ro ...
- thinkjs——修改where默认条件为or
写之前,得先反思一下:总以为大神同事的高冷是一种与大家格格不入的节奏,可是当自己遇到的问题难以解决的时候,大神同事一下子就让问题迎刃而解,于是,满眼的敬佩之感:一定努力当一个像大神同事一样的progr ...