Java线程有以下几种状态(State):
1. 新建(New):当线程对象被创建但尚未调用start()方法时的状态。在这个状态下,线程还没有被系统创建,还未分配到任何CPU时间片。
2. 就绪(Runnable):一旦调用了线程对象的start()方法,线程进入就绪状态。线程处于就绪状态时,表示线程具备了运行的条件,但是还没有被系统选中执行,等待系统的调度。
3. 运行(Running):当线程获得CPU时间片,并执行run()方法中的代码时,线程处于运行状态。
4. 阻塞(Blocked):当线程处于运行状态时,某些情况下需要暂停执行,例如等待某个锁的释放或者等待某个事件发生。这时,线程会进入阻塞状态。当条件满足时,线程进入就绪状态,以便于被系统调度执行。
5. 等待(Waiting):线程在等待某个条件满足时,主动地进入等待状态。等待状态的线程会一直等待,直到其他线程通过notify()、notifyAll()或者指定时间的过期来唤醒它。
6. 超时等待(Timed Waiting):与等待状态类似,但是可以设置等待的时间,当达到指定的等待时间或者其他线程唤醒时,线程会进入就绪状态。
7. 终止(Terminated):线程执行完run()方法中的代码后,或者出现异常导致线程结束,线程进入终止状态。
线程状态之间的转换如下:
- 新建(New) -> 就绪(Runnable):调用start()方法启动线程。
- 就绪(Runnable) -> 运行(Running):线程获得CPU时间片开始执行。
- 运行(Running) -> 就绪(Runnable):线程执行完run()方法、调用yield()方法主动放弃CPU、时间片到达上限等情况。
- 运行(Running) -> 阻塞(Blocked):线程请求某个锁资源而暂时无法获得时。
- 阻塞(Blocked) -> 就绪(Runnable):线程获得了请求的锁资源。
- 运行(Running) -> 等待(Waiting):线程调用了wait()方法主动进入等待状态。
- 运行(Running) -> 超时等待(Timed Waiting):线程调用了sleep()方法或者在等待io等操作时,超过指定时间。
- 等待(Waiting)或超时等待(Timed Waiting) -> 就绪(Runnable):其他线程调用了notify()、notifyAll()方法,或者指定的等待时间到了。
- 运行(Running)/就绪(Runnable) -> 终止(Terminated):线程执行完run()方法,或者出现异常导致线程结束。
了解线程的状态及其之间的转换有助于对线程的运行机制进行理解,合理控制线程的调度和状态转换。注意在多线程编程中,要注意对线程状态的正确处理,以避免并发问题和死锁等情况的发生。