1700449859
1700449860
//启动t1线程
1700449861
1700449862
t1.start();
1700449863
1700449864
for(int i=0;i<5;i++){
1700449865
1700449866
new Thread(t).start();
1700449867
1700449868
}
1700449869
1700449870
//停止t1线程
1700449871
1700449872
t1.stop();
1700449873
1700449874
}
1700449875
1700449876
首先要说明的是所有线程共享了一个MultiThread的实例变量t,其次由于在run方法中加入了同步代码块,所以只能有一个线程进入到synchronized块中。此段代码的执行顺序如下:
1700449877
1700449878
1)线程t1启动,并执行run方法,由于没有其他线程持同步代码块的锁,所以t1线程执行自加后执行到sleep方法即开始休眠,此时a=1。
1700449879
1700449880
2)JVM又启动了5个线程,也同时运行run方法,由于synchronized关键字的阻塞作用,这5个线程不能执行自增和自减操作,等待t1线程锁释放。
1700449881
1700449882
3)主线程执行了t1.stop方法,终止了t1线程,注意,由于a变量是所有线程共享的,所以其他5个线程获得的a变量也是1。
1700449883
1700449884
4)其他5个线程依次获得CPU执行机会,打印出a值。
1700449885
1700449886
分析了这么多,相信读者也明白了输出的结果,结果如下:
1700449887
1700449888
Thread-5:a=1
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
[
上一页 ]
[ :1.700449859e+09 ]
[
下一页 ]