Java中线程的状态主要包括以下几种:
- 新建(New):线程对象刚刚被创建,但尚未开始执行。可以使用
new Thread()或者继承Thread类来创建线程对象。 - 运行(Runnable):线程正在执行其任务或者等待CPU分配时间片来执行。在这个状态下,线程可以是正在运行,也可以是等待运行,具体取决于操作系统的调度。
- 阻塞(Blocked):线程被阻塞,等待某些条件满足后再继续执行。这些条件可能包括等待输入/输出、获取锁、或者等待其他线程的通知。
- 无限期等待(Waiting):线程无限期地等待某个条件的满足,直到其他线程显式地唤醒它。可以通过调用
Object.wait()或者Thread.join()来使线程进入这个状态。 - 有限期等待(Timed Waiting):线程在等待一定时间内等待某个条件的满足,如果超过指定时间仍未满足,则线程会自动唤醒。可以通过调用
Thread.sleep()、Object.wait(long timeout)或者Thread.join(long millis)来使线程进入这个状态。 - 终止(Terminated):线程已经执行完毕或者因异常退出,进入终止状态。
线程状态之间的切换主要取决于以下几种情况:
- 新建 -> 运行:调用线程的
start()方法,启动线程并使其进入运行状态。 - 运行 -> 阻塞:线程在执行过程中遇到了需要等待的条件,如等待输入/输出、获取锁等,此时线程会进入阻塞状态。
- 运行 -> 无限期等待:线程调用
Object.wait()方法或者Thread.join()方法,进入无限期等待状态。 - 运行 -> 有限期等待:线程调用
Thread.sleep()、Object.wait(long timeout)或者Thread.join(long millis)方法,进入有限期等待状态。 - 阻塞 -> 运行:等待的条件被满足,线程会从阻塞状态切换回运行状态。
- 无限期等待 -> 运行:其他线程调用了等待线程的
notify()或notifyAll()方法,或者等待的条件被满足,使线程从无限期等待状态切换回运行状态。 - 有限期等待 -> 运行:等待的时间到达或条件被满足,使线程从有限期等待状态切换回运行状态。
- 运行 -> 终止:线程执行完毕或者因异常退出,进入终止状态。