Java线程基础 - 线程状态
线程状态转换
新建(New)
创建后尚未启动,也就是初始状态
可运行(Runnable)
可能正在运行,也可能正在等待 CPU 时间片。
包含了操作系统线程状态中的 Running 和 Ready。
阻塞(Blocking)
阻塞状态是指线程因为等待某个条件(通常是I/O操作、获取锁、等待某些资源或者其他同步机制)而暂停执行的状态。
等待(Waiting)
处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。
限期等待(Timed Waiting)
无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。
终止(Terminated)
可以是线程结束任务之后自己结束,或者产生了异常而结束。
Q&A
-
如何理解线程的阻塞状态
线程的阻塞状态是指线程因为等待某个条件(通常是I/O操作、获取锁、等待某些资源或者其他同步机制)而暂停执行的状态。在这种状态下,线程不会消耗CPU资源,因为它实际上没有在做任何工作,只是在等待。一旦阻塞的条件得到满足(例如I/O操作完成、锁被释放、资源变得可用),操作系统会将线程的状态改变为就绪状态,这样线程就可以再次被调度执行。
以下是一些导致线程阻塞的常见情况:
● I/O阻塞:进行读写操作时,如果数据尚未准备好,线程将被阻塞,直到I/O操作可以继续进行。
● 同步阻塞:线程尝试获取一个已经被其他线程持有的锁时,它会被阻塞,直到锁被释放。
● 等待阻塞:线程在等待某个事件发生(如等待条件变量、信号量等)时,会被阻塞。 -
什么是线程上下文切换
线程上下文切换是指操作系统在CPU上从一个线程切换到另一个线程的过程。这个过程涉及保存当前线程的上下文(包括程序计数器、寄存器集合、堆栈指针等状态信息)到线程的控制块中,并恢复下一个要执行的线程之前保存的上下文到CPU的寄存器中,这样下一个线程就可以接着之前的状态继续执行。
线程上下文切换通常由以下几种情况触发:
● 时间片用尽:当线程使用完它的时间片(CPU分配给它的执行时间)后,操作系统会进行切换,给其他线程执行的机会。
● I/O请求:当线程发起一个I/O请求并因此被阻塞时,操作系统会切换到另一个线程,以充分利用CPU资源。
● 优先级:当更高优先级的线程变为就绪状态时,操作系统可能会中断当前线程,切换到更高优先级的线程执行。
● 同步机制:当线程在等待同步机制(如锁、信号量等)时,操作系统会进行切换,让其他线程有机会执行。
线程上下文切换是有开销的,涉及到CPU寄存器和其他关键信息的存储与恢复,因此频繁的上下文切换可能会对系统性能产生负面影响。这就是为什么在设计高性能系统时,开发者会尽量减少不必要的上下文切换。