打字猴:1.700449889e+09
1700449889
1700449890 Thread-4:a=1
1700449891
1700449892 Thread-3:a=1
1700449893
1700449894 Thread-2:a=1
1700449895
1700449896 Thread-1:a=1
1700449897
1700449898 原本期望synchronized同步代码块中的逻辑都是原子逻辑,不受外界线程的干扰,但是结果却出现原子逻辑被破坏的情况,这也是stop方法被废弃的一个重要原因:破坏了原子逻辑。
1700449899
1700449900 既然终止一个线程不能使用stop方法,那怎样才能终止一个正在运行的线程呢?答案也很简单,使用自定义的标志位决定线程的执行情况,代码如下:
1700449901
1700449902 class SafeStopThread extends Thread{
1700449903
1700449904 //此变量必须加上volatile
1700449905
1700449906 private volatile boolean stop=false;
1700449907
1700449908 @Override
1700449909
1700449910 public void run(){
1700449911
1700449912 //判断线程体是否运行
1700449913
1700449914 while(stop){
1700449915
1700449916 //Do Something
1700449917
1700449918 }
1700449919
1700449920 }
1700449921
1700449922 //线程终止
1700449923
1700449924 public void terminate(){
1700449925
1700449926 stop=true;
1700449927
1700449928 }
1700449929
1700449930 }
1700449931
1700449932 这是很简单的办法,在线程体中判断是否需要停止运行,即可保证线程体的逻辑完整性,而且也不会破坏原子逻辑。可能有读者对Java API比较熟悉,于是提出疑问:Thread不是还提供了interrupt中断线程的方法吗?这个方法可不是过时方法,那可以使用吗?它可以终止一个线程吗?
1700449933
1700449934 非常好的问题,interrupt,名字看上去很像是终止一个线程的方法,但是我可以很明确地告诉你,它不是,它不能终止一个正在执行着的线程,它只是修改中断标志而已,例如下面一段代码:
1700449935
1700449936 public static void main(String[]args){
1700449937
1700449938 Thread t1=new Thread(){
[ 上一页 ]  [ :1.700449889e+09 ]  [ 下一页 ]