【Java进阶知识】线程的六种状态

线程的状态

线程有如下6种状态:

  • New(新创建 )
  • Runnable(可运行)
  • Blocked(被阻塞)
  • Waiting(等待)
  • Timed waiting(计时等待)
  • Terminated(被终止)

其中,要获取一个线程当前的状态,可以调用getState 方法
下面,对每种状态进行解释

1.新创建线程(New)

当我们使用new操作符来创建了一个线程时,如使用new Thread(r)时,线程还未开始运行,线程中的代码也没有开始执行,此时就成为New状态

2.可运行线程(Runnable)

当我们对一个线程执行start()方法后,就会启动该线程。但是注意,一个处于可运行状态的线程可能正在运行也可能没有运行,这时取决于操作系统的时间片调度。抢占式调度系统会给每一个线程分配一个时间片来运行,在时间片使用完后,操作系统就会剥夺它运行的权力,并更根据优先级选择下一个要运行的线程。

3.被阻塞、等待状态(Blocked、waiting、Timed waiting)

当一个线程处于阻塞和等待状态时,它不做任何工作,也不执行任何代码。直到操作系统重新激活它。

  • 当一个线程试图获取一个内部对象锁,而这个锁又被其它线程持有时,该线程就进入阻塞状态,当其它线程释放这个锁后,并且线程调度器允许该线程持有它时,该线程将会变成非阻塞状态。
  • 当线程等待另一个线程通知调度器一个条件时,它自己就进入等待状态,再调用Object.wait方法或者Thread.join方法时,就会出现这种情况。被阻塞状态和等待状态时大有不同的
  • 有几个方法有一个超时参数。调用它们导致线程进入计时等待状态这一状态将一直保存到超时期满或者接收到适当的通知。带有超时参数的方法有:Thread.sleep 和 Object.wait、Thread.join、 Lock,tryLock 以及 Condition.await 的计时版。

4.被终止的线程

线程终止有两种原因:

  • 因为run()方法执行完毕正常退出
  • 因为一个没有捕获的异常而终止了run方法导致意外死亡

5.总结

在这里插入图片描述

发布了62 篇原创文章 · 获赞 28 · 访问量 6063

猜你喜欢

转载自blog.csdn.net/Moo_Lavender/article/details/103108597