打字猴:1.700449697e+09
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 ]  [ 下一页 ]