❒ 线程通常包括以下几种状态:
✔ 新建状态(New):线程被创建但尚未开始运行。这时,线程对象已经被实例化,但它还没有调用 start() 方法。
✔ 就绪状态(Runnable):线程已经调用 start() 方法,处于就绪状态,等待操作系统的调度。此时,线程可能正在运行,也可能处于等待运行的队列中。
✔ 运行状态(Running):当线程获得 CPU 时间片并被操作系统调度时,它处于运行状态。在这个状态下,线程正在执行其任务。
✔ 阻塞状态(Blocked):线程在等待获得一个锁(例如,等待其他线程释放的同步资源)。当它在等待锁时,线程会进入阻塞状态。
✔ 等待状态(Waiting):线程在等待另一个线程的特定操作(例如,使用 Object.wait() 或 Thread.join() 方法)。此时,线程不会被调度。
✔ 超时等待状态(Timed Waiting):线程在等待某个操作的完成,但会在指定的时间后自动返回。例如,使用 Thread.sleep(millis) 或 Object.wait(millis)。
✔ 终止状态(Terminated):线程的执行完成或因异常终止。在这个状态下,线程已经结束,不会再执行任何代码。
❒ 状态变化的过程:
✔ 新建状态 → 就绪状态:通过调用 start() 方法。
✔ 就绪状态 → 运行状态:操作系统调度线程。
✔ 运行状态 → 阻塞状态:当线程尝试获取一个锁,但该锁被其他线程持有。
✔ 运行状态 → 等待状态:线程调用 Object.wait() 或 Thread.join(),或执行某些阻塞操作。
✔ 运行状态 → 超时等待状态:线程调用 Thread.sleep(millis) 或 Object.wait(millis)。
✔ 阻塞状态 → 就绪状态:当持有锁的线程释放锁,或者等待的条件满足。
✔ 等待状态 → 就绪状态:当被等待的线程完成了其操作,或超时返回。
✔ 超时等待状态 → 就绪状态:当指定的时间过后,线程返回到就绪状态。
✔ 运行状态 → 终止状态:当线程的 run() 方法执行完成或因异常结束。
这些状态和状态之间的转换是多线程编程中非常重要的概念,理解它们对于编写高效和安全的多线程代码至关重要。