打字猴:1.700449635e+09
1700449635
1700449636 //多线程多个垃圾邮件制造机
1700449637
1700449638 SpamMachine sm=new SpamMachine();
1700449639
1700449640 //条件判断,不符合条件就设置该线程不可执行
1700449641
1700449642 if(!false){
1700449643
1700449644 sm.stop();
1700449645
1700449646 }
1700449647
1700449648 //如果线程是stop状态,则不会启动
1700449649
1700449650 sm.start();
1700449651
1700449652 }
1700449653
1700449654 }
1700449655
1700449656 在此段代码中,设置了一个极端条件:所有的线程在启动前都执行stop方法,虽然它是一个已过时(Deprecated)的方法,但它的运行逻辑还是正常的,况且stop方法在此处的目的并不是停止一个线程,而是设置线程为不可启用状态。想来这应该是没有问题的,但是运行结果却出现了奇怪的现象:部分线程还是启动了,也就是在某些线程(没有规律)中的start方法正常执行了。在不符合判断规则的情况下,不可启用状态的线程还是启用了。这是为什么呢?
1700449657
1700449658 这是线程启动(start方法)的一个缺陷。Thread类的stop方法会根据线程状态来判断是终结线程还是设置线程为不可运行状态,对于未启动的线程(线程状态为NEW)来说,会设置其标志位为不可启动,而其他的状态则是直接停止。stop方法的源代码如下:
1700449659
1700449660 public final void stop(){
1700449661
1700449662 if((threadStatus!=0)&&!isAlive()){
1700449663
1700449664 return;
1700449665
1700449666 }
1700449667
1700449668 stop1(new ThreadDeath());
1700449669
1700449670 }
1700449671
1700449672 private final synchronized void stop1(Throwable th){
1700449673
1700449674 /*安全检查省略*/
1700449675
1700449676 if(threadStatus!=0){
1700449677
1700449678 resume();
1700449679
1700449680 stop0(th);
1700449681
1700449682 }else{
1700449683
1700449684 if(th==null){
[ 上一页 ]  [ :1.700449635e+09 ]  [ 下一页 ]