1700449697
1700449698
public synchronized void start(){
1700449699
1700449700
//分配栈内存,启动线程,运行run方法
1700449701
1700449702
start0();
1700449703
1700449704
//在启动前设置了停止状态
1700449705
1700449706
if(stopBeforeStart){
1700449707
1700449708
stop0(throwableFromStop);
1700449709
1700449710
}
1700449711
1700449712
}
1700449713
1700449714
//本地方法
1700449715
1700449716
private native void start0();
1700449717
1700449718
注意看start0方法和stop0方法的顺序,start0方法在前,也就是说即使stopBeforeStart为true(不可启动),也会先启动一个线程,然后再stop0结束这个线程,而罪魁祸首就在这里!
1700449719
1700449720
明白了原因,我们的情景代码也就很容易修改了,代码如下:
1700449721
1700449722
public static void main(String[]args){
1700449723
1700449724
//不分昼夜的制造垃圾邮件
1700449725
1700449726
while(true){
1700449727
1700449728
//条件判断,不符合条件就不创建线程
1700449729
1700449730
if(!false){
1700449731
1700449732
//多线程多个垃圾邮件制造机
1700449733
1700449734
new SpamMachine().start();
1700449735
1700449736
}
1700449737
1700449738
}
1700449739
1700449740
}
1700449741
1700449742
不再使用stop方法进行状态的设置,直接通过判断条件来决定线程是否可启用。对于start方法的该缺陷,一般不会引起太大的问题,只是增加了线程启动和停止的精度而已。
1700449743
1700449744
1700449745
1700449746
[
上一页 ]
[ :1.700449697e+09 ]
[
下一页 ]