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,因此,无法停止线程。

0 0
原创粉丝点击