Java线程生命周期各个状态总结

最近在学习Java技术相关基础知识,所以准备边学习便总结,写这个博客主要是做个记录方便自己回查,但然顺便也就方便了别人,这个作为Java基础知识学习的第一篇文章,好像也不怎么基础,之后整个系列的Java博客文章也不会按照Java学习循序来,都是自己觉得有必要记录的干活就写,只是规到一个Java学习的大类中来。

1、生命状态分类

根据Java API文档将Java线程运行在JVM中的状态分成六个状态,废话不说,上图

这里写图片描述

下面就分别对这几个状态进行一一说明

new 状态

new 这个状态比较简单,我们创建线程时通过new方法来创建,刚刚创建好还没有没有执行start方法的线程对象就处于new状态,如下面的线程

NewThread newThread = new NewThread();

terminated 状态

这个状态也很简单,就是线程执行run方法,执行完毕了,那么线程就结束了,也就是这里标注的task completes的意思。不过有一点要注意,一个线程对象只能start一次,而且线程结束后,便不能再进入其它状态,毕竟人死不能复生,线程也一样。

runnable 状态

从图中可以看出runnable状态是其它几个状态的枢纽,而runnable状态实际上又可以细分成两种状态,如下图所示
这里写图片描述

这里的ready状态代表该线程准备好了,随时可以由调度器分配给cpu执行,而running状态呢表示该线程正在占用cpu,当线程的量子操作结束后,又可能由调度器让出cpu进如ready状态。

waiting 状态

当线程处在runnable状态时调用了wait()方法(不带参数),这时候该线程就进入了waiting状态,比较要命的是线程一旦进入了waiting状态就不会自己醒来了,必须要别的线程通过notify或者notifyAll方法来唤醒,不然该线程一直处于waiting状态,永远也得不到使用cpu的机会。

timed waiting状态

这个状态和waiting状态有些相似,不同的是该状态会有一个时间设置让自己定时醒来,时间一到就进入到runnable状态,而这个时间呢也是在runnable状态时候调用wait(int ms)或者sleep(int ms)来进入timed waiting状态。这里要注意的是wait方法会让当前线程释放线程锁,而sleep方法不会,至于什么是线程锁,下面的板块再来解释下吧。

blocked 状态

这个状态就是我们常讲的阻塞状态了,什么时候会进入阻塞状态呢,还是看图,当出现I/O input请求时候该线程会被阻塞掉,另外就是图中提到的enter synchronized statement,这是什么意思呢,举个例子吧,线程A获取cpu并进入synchronized statement,那么原来处于runnable的B资源一时半会没有办法得到cpu,只能等线程A的synchronized statement执行完毕后,才能有机会获取cpu,既然是干等,不如就先进入了blocked状态,当线程A执行完synchronized statement后再进入runnable状态。

以上就是关于Java线程生命周期的总结。

2、一些概念名词的解释

本文涉及到一些概念名词,个人觉得有必要解释一下,同时还有一些概念名词后续文章中可能也会用到就一并在本文中加以解释了。

线程锁

假设有一个共享资源类SharedResource其中有getResouce和setResouce方法,当为这个方法添加sychronized关键字的时候,这个SharedResource的对象实例就相当于一个线程锁。当有线程执行getResource或者setResource时候,这个sychronized关键字能够保证对应操作的原子性。

当多个线程同时要使用这个共享资源时(这里用AB表示),线程A执行synchronized方法表示线程A获取到线程锁,线程B由于没有锁,便无法执行线程锁中的任意synchronized方法,此时线程B被放入了锁池中,当线程A执行完synchronized方法后,释放线程锁,线程B才能从锁池中出来争取获得线程锁的机会(不一定能争取到)。

同时要注意wait 和 notify对应的两大类方法是线程锁的方法,而不是线程的方法。

锁池

这里讲锁池,就不得不提到对应的 等待池 概念,其实从对线程锁的解释中都大致能知道锁池的作用了,锁池就是存放没有获取到线程锁的线程的池子,当对应获取线程锁的程释放线程锁后,其它对应线程就能从锁池中被释放,获取获取线程锁的机会。等待池就不一样了,等待池是在线程锁中执行wait方法,那么持有该线程锁的线程便进入到等待池,如果其它线程在线程锁中不调用notify/notifyAll方法的话,那么进入等待池的线程将永远不会再有获取共享资源(线程锁)的机会。

同时,这里要明确,这里的线程锁、锁池、等待池的概念都是在多线程共享资源的情况下出现的,其中共享资源中必须有同步方法(可通过sychronized方法或者Lock对象锁实现)。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值