java 多线程5: java 终止线程及中断机制 (stop()、interrupt() 、interrupted()、isInterrupted())
2017-03-23 18:00
519 查看
JAVA中有3种方式可以终止正在运行的线程
①线程正常退出,即run()方法执行完毕了
②使用Thread类中的stop()方法强行终止线程。但stop()方法已经过期了,不推荐使用
③使用中断机制interrupt()
1.stop()方法
stop()在java多线程中已经废弃
1.stop()方法会导致释放锁的不良后果,数据不完整
比如一个上锁了得方法:
threadA线程拥有了监视器,这些监视器负责保护某些临界资源,比如说银行的转账的金额。当正在转账过程中,main线程调用 threadA.stop()方法或者this.stop()。结果导致监视器被释放,其保护的资源(转账金额)很可能出现不一致性。比如,A账户减少了100,而B账户却没有增加100,没有保证数据原子性
2.当线程调用stop()方法时,会立刻终止线程的所有操作,并抛出ThreadDeath异常,通常不需要捕捉
2.interrupt() 中断机制
这个方法是实例方法 ,但是它不会真的中断一个正在运行的线程,而是给线程打一个停止的标记,还需要配合判断来优雅的终止线程
运行代码
输出结果
可以看的出来 ,interrupt() 并不会真正的停止正在运行的线程,那么如何停止线程呢
3.判断线程的停止状态
interrupted()方法与 isInterrupted()方法能反映当前线程的终止状态
看的出来 interrupted() 是静态方法 而 isInterrupted() 是实例方法
1.interrupted()方法
可以从上面看出 interrupt() 执行了线程 interrupted() 方法 第一调用返回是true , 第二次调用返回时false,在这里查看interrupted()的源码发现该方法会清楚中断状态
[/code]
源码发现该方法interrupted() 会调用 isInterrupted 方法 传入 参数clean 状态,调用改方法,改方法内部会清除中断状态
2. isInterrupted()方法
继续根据上面的示例创建 Run3
总结了两个判断线程中断的区别 , 下面开始优雅的中断线程了
①线程正常退出,即run()方法执行完毕了
②使用Thread类中的stop()方法强行终止线程。但stop()方法已经过期了,不推荐使用
③使用中断机制interrupt()
1.stop()方法
stop()在java多线程中已经废弃
1.stop()方法会导致释放锁的不良后果,数据不完整
比如一个上锁了得方法:
threadA线程拥有了监视器,这些监视器负责保护某些临界资源,比如说银行的转账的金额。当正在转账过程中,main线程调用 threadA.stop()方法或者this.stop()。结果导致监视器被释放,其保护的资源(转账金额)很可能出现不一致性。比如,A账户减少了100,而B账户却没有增加100,没有保证数据原子性
2.当线程调用stop()方法时,会立刻终止线程的所有操作,并抛出ThreadDeath异常,通常不需要捕捉
2.interrupt() 中断机制
这个方法是实例方法 ,但是它不会真的中断一个正在运行的线程,而是给线程打一个停止的标记,还需要配合判断来优雅的终止线程
运行代码
输出结果
可以看的出来 ,interrupt() 并不会真正的停止正在运行的线程,那么如何停止线程呢
3.判断线程的停止状态
interrupted()方法与 isInterrupted()方法能反映当前线程的终止状态
看的出来 interrupted() 是静态方法 而 isInterrupted() 是实例方法
1.interrupted()方法
可以从上面看出 interrupt() 执行了线程 interrupted() 方法 第一调用返回是true , 第二次调用返回时false,在这里查看interrupted()的源码发现该方法会清楚中断状态
public boolean isInterrupted() {
return isInterrupted(false);
}
/**
* Tests if some Thread has been interrupted. The interrupted state
* is reset or not based on the value of ClearInterrupted that is
* passed.
*/
private native boolean isInterrupted(boolean ClearInterrupted);
[/code]
源码发现该方法interrupted() 会调用 isInterrupted 方法 传入 参数clean 状态,调用改方法,改方法内部会清除中断状态
2. isInterrupted()方法
继续根据上面的示例创建 Run3
总结了两个判断线程中断的区别 , 下面开始优雅的中断线程了
相关文章推荐
- JAVA多线程之中断机制stop()、interrupted()、isInterrupted()
- JAVA多线程之中断机制(stop()、interrupted()、isInterrupted())
- Java中的线程中断:interrupt()、interrupted()和isInterrupted
- JAVA多线程之中断机制(stop()、interrupted()、isInterrupted())
- 线程的终止stop与线程的中断interrupted
- 线程中断,interrupt(),interrupted,isInterrupted()
- JAVA多线程之中断机制(stop()、interrupted()、isInterrupted())
- Java Thread的中断以及interrupt()、isInterrupted()、interrupted
- java线程中的interrupt,isInterrupt,interrupted方法以及如何终止线程(二)
- java 多线程6: 中断机制 优雅的终止java线程
- Android Thread interrupt 中断JAVA线程
- Java Thread.interrupt 中断JAVA线程
- Java Thread.interrupt 中断JAVA线程
- 中断线程Interrupt与Interrupted的用处
- 详细分析Java中断机制---线程
- java线程中断[interrupt()函数]
- Java Thread.interrupt 中断JAVA线程
- 用interrupt()中断Java线程
- java线程中断[interrupt()函数] (转载)
- java线程之中断interrupt详解