27、Java入门—多线程之线程的正确停止
来源:互联网 发布:java pointer 编辑:程序博客网 时间:2024/06/05 20:48
1:首先使用线程自带的方法stop(),是不正确的,原因如下:此方法会导致线程戛然而止,我们不清楚线程完成了什么,没完成什么,也没有时间来完成对应的线程运行的清理工作。
2:正确停止线程的方法是,在线程执行中设置状态标识,通过控制此状态标识,来控制线程的正常完整的结束,另外,volatile关键字是保证线程变量对外可见的标志,通过此关键字修饰的状态变量,才能在别的线程中被正确的赋值。
如何正确停止Java中的线程——not stop()方法
//错误的停止线程的方法
armyTaskOfSuiDynasty.stop();
armyTaskOfRevolt.stop();
//正确的停止线程的方法(使用做标记的方法来正确退出)
armyTaskOfSuiDynasty.keepRunning=false;
armyTaskOfRevolt.keepRunning=false;
在线程中,停止线程的方法:设置旗标
使用volatile 定义boolean running=true,通过设置标志变量running,来结束线程。
如本文:volatile boolean keepRunning=true;
这样做的好处是:使得线程有机会使得一个完整的业务步骤被完整地执行,在执行完业务步骤后有充分的时间去做代码的清理工作,使得线程代码在实际中更安全
结束命令false下达后,仍要执行n次循环,n最大为5,最小为0,取决于命令下达时已经执行了几次
解了我的疑惑:
将keepRunning=false后线程怎么还能继续运行呢,并没有在其他地方重新设置为true啊
这样while循环不是不成立吗,为什么还会执行里面的for循环?
广为流传的错误方法---interrupt方法
while(!this.isInterrupt()){//实质上还是做标记
syso..."Thread is running...";
long time=System.currentTimeMillis();
while(System.currentTimeMillis()-time<1000){
//减少屏幕输出的空循环
}
}
//效果相当于Thread.sleep(1000);为何不使用sleep?interrupt()方法只能设置interrupt标志位(且在线程阻塞情况下,标志位会被清除,更无法设置中断标志位),无法停止线程。
Ps:一个线程在阻塞状态下(例如sleep),此时interrupt的话,将会产生两个结果:
1、进程的interrupt状态被清除(cleard)而非被设置(set)。
2、sleep方法会抛出异常。
线程1由于sleep、join等方法进入阻塞状态,其他线程(主线程)运行中调用线程1的interrupt方法,使得线程1的中断标志位置为true,此时线程1的sleep或join等方法检测到其中断标志位为true,抛出中断异常停止阻塞状态清空中断标志即置为false,因此,无法停止线程。
- 27、Java入门—多线程之线程的正确停止
- Java多线程初探——正确停止线程
- java多线程之停止线程
- java多线程之-----停止线程
- Java多线程之停止线程
- Java多线程 线程的停止
- 【Java语言】Ja.1.2--浅谈多线程机制(二)之正确停止线程
- 浅析Java线程的正确停止
- JAVA-线程的正确停止方法
- Java中的多线程(四)之线程的停止
- Java多线程之停止一个线程
- java多线程之启动,停止线程
- Java多线程编程核心技术之---停止线程
- java 多线程 停止线程
- JAVA-多线程-停止线程
- java多线程 ---- 停止线程
- Java多线程-停止线程
- 如何正确停止线程(JAVA)
- Dialog源码分析
- C++结构体对齐和位域
- 第13节--神经网络算法
- windows平台下基于VisualStudio的Clang安装和配置
- SurfaceView播放视频的截图
- 27、Java入门—多线程之线程的正确停止
- Eclipse RCP - Multiple platforms build
- 视频编解码(1)
- 弹性文本框
- iOS中如何去掉cell分割线
- 微信运动微信排行榜
- 多功能电能表的四象限
- php验证邮箱格式
- 简单易懂的jquery版三级联动select