结束线程方法2 Java提供的中断机制
package com.mozq.thread.interrupt;
/**
* 注意:调用interrupt()方法,并不会结束线程。
* 结束线程的语义:需要我们自己使用3个中断方法构建。
*
* 没有任何语言方面的需求一个被中断的线程应该终止。
* 中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断。
* 某些线程非常重要,以至于它们应该不理会中断,而是在处理完抛出的异常之后继续执行。
* 但是更普遍的情况是,一个线程将把中断看作一个终止请求,这种线程的run方法遵循如下形式
public void run() {
try {
...
* 不管循环里是否调用过线程阻塞的方法如sleep、join、wait,这里还是需要加上
* !Thread.currentThread().isInterrupted()条件,虽然抛出异常后退出了循环,显
* 得用阻塞的情况下是多余的,但如果调用了阻塞方法但没有阻塞时,这样会更安全、更及时。
while (!Thread.currentThread().isInterrupted()&& more work to do) {
do more work
}
} catch (InterruptedException e) {
//线程在wait或sleep期间被中断了
} finally {
//线程结束前做一些清理工作
}
} 上面是while循环在try块里,如果try在while循环里时,因该在catch块里重新设置一下中断标示,
因为抛出InterruptedException异常后,中断标示位会自动清除,此时应该这样:
public void run() {
while (!Thread.currentThread().isInterrupted()&& more work to do) {
try {
...
sleep(delay);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();//重新设置中断标示
}
}
} * 结束线程方法2:interrupt()方法,interrupted()方法和isInterrupted()方法
* 该方法的中断语义详细定义在说明文档中。和通常所说的中断意思不一致。
* interrupt()方法用于设置:
* 如果线程处于wait,sleep,join阻塞,则会发生中断异常。中断状态为被清除。
* 一般情况则导致中断状态位被设置
* isInterrupted()检测不清除
* interrupted()检测并清除。
* 通过这3个方法,适用于一个线程向另一个线程发送信息,并被B线程处理。
* 可以用来实现线程A根据情况结束线程B的语义。
*
* 分成2种情况,1.线程处于阻塞状态2.线程处于正常运行
* 线程处于正常运行
* public class ThreadSafe extends Thread {
public void run() {
while (!isInterrupted()){
//do something, but no throw InterruptedException
}
}
}
线程处于阻塞状态
public class ThreadSafe extends Thread {
public void run() {
while (!isInterrupted()){ //非阻塞过程中通过判断中断标志来退出
try{
Thread.sleep(5*1000);//阻塞过程捕获中断异常来退出
}catch(InterruptedException e){
e.printStackTrace();
break;//捕获到异常之后,执行break跳出循环。
}
}
}
}
1
* @author jie
*
*/
public class MyInterruptMethod {
public static void main(String[] args) {
Thread t = new Thread() {
//方法1:
/*
@Override
public void run() {
try {
while(!Thread.currentThread().isInterrupted()) {
System.out.println(Thread.currentThread().getName() + "...run");
Thread.sleep(100);
}
} catch (InterruptedException e) {}
}
*/
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()) {
System.out.println(Thread.currentThread().getName() + "...run");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
//因为虚拟机处理interrupt调用时,如果方法处于阻塞,会抛出异常并清除中断标志,所以此处需要重置。
Thread.currentThread().interrupt();
//return;
//break;
}
}
} };
t.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//业务逻辑。。。
//此处想结束线程
t.interrupt();
}
}
结束线程方法2 Java提供的中断机制的更多相关文章
- 【Java 线程的深入研究1】Java 提供了三种创建线程的方法
Java 提供了三种创建线程的方法: 通过实现 Runnable 接口: 通过继承 Thread 类本身: 通过 Callable 和 Future 创建线程. 1.通过实现 Runnable 接口来 ...
- (转)Java结束线程的三种方法
背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. Java结束线程的三种方法 线程属于一次性消耗品,在执行完run()方法之后线程 ...
- Java结束线程的三种方法(爱奇艺面试)
线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...
- Java结束线程的三种方法
线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...
- java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期
Interrupt学习: 在jdk中关于interrupt相关方法有三个,如下: 关于上面的疑问会在稍后进行阐述滴,下面看代码: 编译运行: 应该说是t线程为啥在被打断之后没有退出,还是在运行状态,这 ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- 转: Java安全停止线程方法
转: http://blog.csdn.net/flyingpig4/article/details/7675557 1.早期Java提供java.lang.Thread类型包含了一些列的方法star ...
- Java安全停止线程方法
1. 早期Java提供java.lang.Thread类型包含了一些列的方法 start(), stop(), stop(Throwable) and suspend(), destroy() and ...
- Java自学-多线程 常见线程方法
Java 常见的线程方法 示例 1 : 当前线程暂停 Thread.sleep(1000); 表示当前线程暂停1000毫秒 ,其他线程不受影响 Thread.sleep(1000); 会抛出Inter ...
随机推荐
- jQuery——能够编辑的表格
版权声明:欢迎转载,请注明出处 https://blog.csdn.net/suneqing/article/details/26856635 今天学习了利用jQuery实现能够编辑的表格这个 ...
- Mongoose学习(2)
1.Schema的扩展 UserSchema.methods.findUserName = function(cb){ return this.model('user').find({username ...
- IDEA eclipse 控制台日志输出到文件
eclipse IDEA
- Ubuntu 下安装Source Insight [转]
本文转载自:http://blog.csdn.net/yunfeiyang62/article/details/46662633 安装Source Insight之前需要先安装Wine,然后用Wine ...
- POJ1006 Biorhythms —— 中国剩余定理
题目链接:https://vjudge.net/problem/POJ-1006 Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total ...
- Yii的缓存机制之数据缓存
具体说法就是可以缓存变量信息. 设置:Yii::app()->cache->set(名字, 值, 过期时间): 使用:Yii::app()->cache->get(名字); 删 ...
- UniCode转码
<script type="text/javascript"> var GB2312UnicodeConverter = { ToUnicode: function ( ...
- H3C-端口镜像
本地端口镜像配置举例 配置Switch: <Sysname> system-view [Sysname] mirroring-group 1 local # 创建本地镜像组 [Sysnam ...
- BZOJ_3786_星系探索_splay维护出栈入栈序
BZOJ_3786_星系探索_splay维护出栈入栈序 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为 ...
- POJ1226(strstr)
Substrings Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13348 Accepted: 4722 Descr ...