1700449797
1700449798
thread.stop();
1700449799
1700449800
}
1700449801
1700449802
这段代码的逻辑是这样的:子线程是一个匿名内部类,它的run方法在执行时会休眠1秒钟,然后再执行后续的逻辑,而主线程则是休眠0.1秒后终止子线程的运行,也就是说,JVM在执行thread.stop()时,子线程还在执行sleep(1000),此时stop方法会清除栈内信息,结束该线程,这也就导致了run方法的逻辑不完整,输出语句println代表的是一段逻辑,可能非常重要,比如子线程的主逻辑、资源回收、情景初始化等,但是因为stop线程了,这些就都不再执行,于是就产生了业务逻辑不完整的情况。
1700449803
1700449804
这是极度危险的,因为我们不知道子线程会在什么时候被终止,stop连基本的逻辑完整性都无法保证。而且此种操作也是非常隐蔽的,子线程执行到何处会被关闭很难定位,这为以后的维护带来了很多麻烦。
1700449805
1700449806
(3)stop方法会破坏原子逻辑
1700449807
1700449808
多线程为了解决共享资源抢占的问题,使用了锁概念,避免资源不同步,但是正因此原因,stop方法却会带来更大的麻烦:它会丢弃所有的锁,导致原子逻辑受损。例如有这样一段程序:
1700449809
1700449810
class MultiThread implements Runnable{
1700449811
1700449812
int a=0;
1700449813
1700449814
@Override
1700449815
1700449816
public void run(){
1700449817
1700449818
//同步代码块,保证原子操作
1700449819
1700449820
synchronized(””){
1700449821
1700449822
//自增
1700449823
1700449824
a++;
1700449825
1700449826
try{
1700449827
1700449828
//线程休眠0.1秒
1700449829
1700449830
Thread.sleep(100);
1700449831
1700449832
}catch(InterruptedException e){
1700449833
1700449834
e.printStackTrace();
1700449835
1700449836
}
1700449837
1700449838
//自减
1700449839
1700449840
a—;
1700449841
1700449842
String tn=Thread.currentThread().getName();
1700449843
1700449844
System.out.println(tn+”:a=”+a);
1700449845
1700449846
}
[
上一页 ]
[ :1.700449797e+09 ]
[
下一页 ]