正确中断java线程
不提倡的stop()方法
臭名昭著的stop()停止线程的方法已不提倡使用了,原因是什么呢?
当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,并抛出特殊的ThreadDeath()异常。这里的“立即”因为太“立即”了,
假如一个线程正在执行:
synchronized void { x = 3; y = 4;}
由于方法是同步的,多个线程访问时总能保证x,y被同时赋值,而如果一个线程正在执行到x = 3;时,被调用了 stop()方法,即使在同步块中,它也干脆地stop了,这样就产生了不完整的残废数据。而多线程编程中最最基础的条件要保证数据的完整性,所以请忘记 线程的stop方法,以后我们再也不要说“停止线程”了。
如何才能“结束”一个线程?
interupt()中断线程
一个线程从运行到真正的结束,应该有三个阶段:
- 正常运行.
- 处理结束前的工作,也就是准备结束.
- 结束退出.
那么如何让一个线程结束呢?既然不能调用stop,可用的只的interrupt()方法。但interrupt()方法只是改变了线程的运行状态,如何让它退出运行?对于一般逻辑,只要线程状态已经中断,我们就可以让它退出,这里我们定义一个线程类ThreadA,所以这样的语句可以保证线程在中断后就能结束运行:
while(!isInterrupted()){ 正常逻辑 }
,一个测试类,ThreadDemo
这样ThreadDemo调用interrupt()方法,isInterrupted()为true,就会退出运行。但是如果线程正在执行wait,sleep,join方法,你调用interrupt()方法,这个逻辑就不完全了。
我们可以这样处理:
public void run(){ while(!isInterrupted()){ try{ 正常工作 }catch(InterruptedException e){ //nothing } } } }
想一想,如果一个正在sleep的线程,在调用interrupt后,会如何?wait方法检查到isInterrupted()为true,抛出异常, 而你又没有处理。而一个抛出了InterruptedException的线程的状态马上就会被置为非中断状态,如果catch语句没有处理异常,则下一 次循环中isInterrupted()为false,线程会继续执行,可能你N次抛出异常,也无法让线程停止。
这个错误情况的实例代码
ThreadA
public class ThreadA extends Thread ...{
int count=0;
public void run()...{
System.out.println(getName()+"将要运行...");
while(!this.isInterrupted())...{
System.out.println(getName()+"运行中"+count++);
try...{
Thread.sleep(400);
}catch(InterruptedException e)...{
System.out.println(getName()+"从阻塞中退出...");
System.out.println("this.isInterrupted()="+this.isInterrupted());
}
}
System.out.println(getName()+"已经终止!");
}
}
ThreadDemo
public static void main(String argv[])throws InterruptedException...{
ThreadA ta=new ThreadA();
ta.setName("ThreadA");
ta.start();
Thread.sleep(2000);
System.out.println(ta.getName()+"正在被中断...");
ta.interrupt();
System.out.println("ta.isInterrupted()="+ta.isInterrupted());
}
}
那么如何能确保线程真正停止?在线程同步的时候我们有一个叫“二次惰性检测”(double check),能在提高效率的基础上又确保线程真正中同步控制中。那么我把线程正确退出的方法称为“双重安全退出”,即不以isInterrupted ()为循环条件。而以一个标记作为循环条件:
正确的ThreadA代码是:
public class ThreadA extends Thread ...{
private boolean isInterrupted=false;
int count=0;
public void interrupt()...{
isInterrupted = true;
super.interrupt();
}
public void run()...{
System.out.println(getName()+"将要运行...");
while(!isInterrupted)...{
System.out.println(getName()+"运行中"+count++);
try...{
Thread.sleep(400);
}catch(InterruptedException e)...{
System.out.println(getName()+"从阻塞中退出...");
System.out.println("this.isInterrupted()="+this.isInterrupted());
}
}
System.out.println(getName()+"已经终止!");
}
}
正确中断java线程相关推荐
- 如何中断JAVA线程
如何中断JAVA线程 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误. 在本篇文章中,我们针对这些难题之 ...
- Android Thread interrupt 中断JAVA线程(转)
转载自:http://hi.baidu.com/%E3%C6%CE%C4%B7%E5/blog/item/d8959f1b6716c8168618bfbb.html 假如我们有一个任务如下,交给一个J ...
- 用interrupt()中断Java线程
http://hapinwater.iteye.com/blog/310558 最近在学习Java线程相关的东西,和大家分享一下,有错误之处欢迎大家指正. 假如我们有一个任务如下,交给一个Java线程 ...
- 数值分析 使用c语言 源码_分析源码,学会正确使用 Java 线程池
在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况,包括异常的处理和分析等.本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议.文中会 ...
- java 中如何正确的停止线程
如何优雅的停止一个线程 1.为什么要停止线程 2.为何说要正确的停止线程 3.使用interrupt()停止线程 4.线程在通常三种情况下停止 4.1 普通情况 4.2 线程阻塞情况 4.3 传递中断 ...
- java 线程中断(转)
程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误. 在本篇文章中,我们针对这些难题之一:如何中断一个正在运 ...
- java线程锁标记_java 线程 中断标志位
课程素材来自 http://enjoy.ke.qq.com/ 版权所有 java线程中,线程中断方法详解: 线程自然终止:自然执行完或抛出未处理异常 stop(),resume(),suspen ...
- java 线程 中断标志位
课程素材来自 http://enjoy.ke.qq.com/ 版权所有 java线程中,线程中断方法详解: 线程自然终止:自然执行完或抛出未处理异常 stop(),resume(),suspen ...
- java线程的中断(interrupt)
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等. 所以你看到Thread.suspend, Threa ...
最新文章
- 在GDI+中用Mattix类对2D矢量图形进行平移、缩放操作
- C++ 退出双层for循环,解决 break、return、continue无法实现问题
- Time value help in webclient UI
- Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 期望dp
- js压缩图片_Web 性能优化: 图片优化让网站大小减少 62%
- java访问数据库方式_java数据库访问(二)—JDBC方式(配合连接池)
- 聊聊 rel=noopener
- 无线视频服务器家里好用吗,短视频APP为什么选择国内大带宽服务器?国内服务器有什么优势...
- Linux kernel路由机制分析(下)
- PTA 基础编程题目集 7-15 计算圆周率 C语言
- NSA机密文件泄密者如何暴露身份
- 3D游戏案例:滚动天空(超低配版)
- 接入网、承载网、核心网是什么,交换机路由器是什么、这个和网络的协议有什么关系呢?
- 微信小程序map地图轨迹回放的问题
- logback之二:输出日志到控制台
- java application_运行java application时,总是报错
- Android:技术在线面试还是屡次撞板,过来人告诉你不及时
- C语言项目-ATM自助取款机(无图形化界面)
- Acwing4366上课睡觉
- iOS上传视频到服务器
热门文章
- svn 中 版本回退
- 关于练习美剧听写中碰到的问题
- Loadrunner中web_reg_save_param的使用详解
- 关于各种无法解析的外部符号问题的相应解决方案【转】
- border-box和CSS3 calc()解决盒模型加边框或边距后尺寸变大的问题
- Delphi字符串转日期,强大到窒息,VarToDateTime解决了困扰很久的小问题
- **【校招速递】入职鹅厂,算法大赛优秀选手开启职场新生活**
- 鹅厂算法大神干货实录,初赛通关“秘籍”还不赶快来GET!
- 在html中 标记 lt pre gt,HTML pre标记会导致换行符
- java for新循环_java新特性-新式for循环(For_Each)