Java线程的状态

Java中线程的状态一共有6种:


image.png

图片来源于网络

  • 新建(New):新建一个线程对象,但没有调用start()方法;从New状态出发后,线程就不会回到New状态
  • 运行(Runnable):Java中将正在运行(Running)和就绪(Ready)统称为运行(Runnable)。线程创建后,其他线程若调用了该线程的start()方法,则该线程进入就绪(Ready)状态,等待获取CPU的时间片。而该线程获得CPU时间片后则转变为正在运行(Running)。
    就绪(Ready)状态:当没有分配CPU时间片时,线程永远处于就绪(Ready)状态;当调用了start()方法时,线程就进入就绪(Ready)状态;当线程的sleep()方法结束,或其他线程join()结束,等待用户输入完毕又或者某个线程拿到对象锁后,这些线程也会进入就绪状态;当前线程的时间片使用完后,调用当前线程的yield()方法,当前线程也会进入就绪状态,当阻塞状态中等待锁的线程拿到锁后,进入就绪状态。
    运行(Running)状态:CPU从线程池中选择一个线程,从而使得该线程处于运行(Running)状态。这也是线程进入运行(Running)状态的唯一方式。
  • 阻塞(BLOCKED):线程在运行过程中,会由于各种原因进入阻塞状态:
  1. 线程通过调用sleep方法进入睡眠状态;
  2. 线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
  3. 线程试图得到一个锁(synchronized等),而该锁正被其他线程持有;
  4. 线程在等待某个触发条件;
    ......
    阻塞状态指正在运行的线程没有运行结束,暂时让出了CPU时间片,此时其处于就绪(Ready)状态的线程就可以获取CPU时间片,进入运行状态。
  • 等待(Waiting):表示线程等待(或者说挂起),让出CPU资源给其他线程使用
    Waiting的线程一般在等待一些特殊的事件,比如通过wait()方法等待的线程在等待notify()方法,而通过join()方法等待的线程则会等待目标线程的终止。一旦等到了期望事件,线程就会再次执行。
  • 超时等待(Timed_Wating):处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。
  • 终止(TERMINATED):表示线程已执行完毕。当线程的run()方法执行完毕,或者主程序的main()函数完成时,我们就认为它终止了。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦终止了,就不能复生也就是无法再次回到Runnable状态。举个例子,你在淘宝下了一个订单,订单号相当于线程编号,假如你把这个订单取消了,则这个订单无法恢复,就算重新下单同样的商品订单号也会不一样(不是同一个线程)。在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 线程的生命周期 Java语言中定义了5种线程状态,在任意一个时间点,一个线程只能有且只有其中一种状态,这5种状态是...
    FX_SKY阅读 11,955评论 4 2
  • 线程的状态切换 线程在它的生命周期中会处于各种不同的状态 1.新建态(New) 用new语句创建的线程对象处于新建...
    程序o07阅读 1,696评论 0 0
  • Java线程的状态 线程的状态摘录 1.新建(NEW):新创建了一个线程对象。 2.可运行(RUNNABLE):线...
    小七_8d72阅读 1,443评论 0 0
  • 0 前言 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要...
    七寸知架构阅读 10,564评论 2 63
  • 下面将会针这张图对线程的状态转换来做解释 在操作系统的课程中把线程大致分为了3个状态1.就绪状态(线程对资源上锁,...
    jchen104阅读 4,355评论 0 0