新人谈Java线程的正常死亡与资源浪费

java线程与一个生命一样,也有着自己的生命周期,分别是,新建状态,就绪状态,运行状态,阻塞状态,消亡状态。

而线程有如下三种消亡方式,结束后就处于死亡状态

1、run()或者call()方法执行完成,线程正常结束;

2、线程抛出一个未捕获的Exception或Error;

3、直接调用该线程的stop()方法来结束该线程;

那么什么叫线程的死亡呢?

从字面意思理解死亡是不可逆转的,一旦一个线程死亡后,是不可能再次复活的,如果你想启用这个线程,那就只能重新生(new)一个新的线程。新手经常被因为不理解线程这个特性,被自己写的线程弄得一头雾水

就比如你定义一个布尔值start=false,用按键监听来改变它为true来控制输出1这个数字,run()代码如下

public void run() {			
      while(true)   {
	   if(start) {
             System.out.println(1);
                       }
                     }
                   }    
                 
然后你运行程序,会发现线程并没有一直运转,即使加了while(true),于是你在循环里加了一句输出语句,来判断线程是否运转,代码如下
public void run() {			
      while(true) {
             System.out.println(2);
	   if(start) {
             System.out.println(1);
                       }
                     }
                   }

然后你会发现线程又能用了,但是去了输出语句就又不能用了,你是否碰到过这种让人费解的情况,这其实就是线程的死亡判定在作怪,第一个代码在被启动后第一次执行时,while循环里面因为if判断为假,没有执行语句,所以自然死亡,但是你在white循环里加一个输出语句,就可以让while循环一直循环下去,从而线程不会死亡。打个比喻,就像那些反派的手下,在他任务执行完时,没有了利用价值,被杀了灭口,线程也是这样,没有任务就会死亡。

但这又会导致一个问题,你会发现这个程序十分的占用CPU,这就是因为你的线程因为一个while(true)达到了一个不会自然死亡的状态,那么CPU就必须要腾出更多的内存来运行这个线程,即使它只输出一个1,计算机的运算速度,1秒足够输出几百万次,甚至几千万次,而我们需要的输出次数要远远小于这个值,而且,即使if条件不成立,也会一直的在不断的判断,人的感知能力,0.1秒是很短的,可计算机在这0.1秒进行了几百万次的判断,这势必会造成大量的资源浪费,所以我进行如下改进

public void run() {			
      while(start2) {
	   if(start1) {
             System.out.println(1);
                       }
                     }else{
                                   try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
                             }
                    }
首先把线程的生命交给一个布尔值start2来控制,因为这个线程是可以结束的,所以CPU就不会过度的给这个线程内存,并且也避免了忘记关控制台线程一直叠加造成的电脑死机问题,而且else语句里的sleep可以有效的减少计算机的运算频率,一秒十次的判断刚刚好,从而释放那些浪费的资源,并且还吊着线程不会死亡,简直是一举两得。

学习线程这一块一定要小心,很容易使电脑死机,博主我作为一个刚入java的新人就因此没少吃亏,各种重启,以上是我对线程的一点浅薄的了解,希望对你有用,如有不足,还望指出。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值