Java面试题之多线程 线程的状态转换?
在Java中,线程的状态转换主要有以下几种状态:
新建状态 (New):
start()
方法尚未被调用。Thread thread = new Thread();
就绪状态 (Runnable):
start()
方法后,线程进入就绪状态。此时,线程可以被调度执行,但并不一定立即执行。就绪状态的线程会等待CPU的调度。thread.start();
运行状态 (Running):
run()
方法。阻塞状态 (Blocked):
等待状态 (Waiting):
Object.wait()
、Thread.join()
或LockSupport.park()
等方法。处于等待状态的线程会一直等待,直到其他线程通知它(例如调用notify()
或notifyAll()
)或中断。超时等待状态 (Timed Waiting):
Thread.sleep(millis)
、Object.wait(millis)
、Thread.join(millis)
或LockSupport.parkNanos()
等方法时,会进入超时等待状态。线程会在指定的时间后自动返回就绪状态。终止状态 (Terminated):
run()
方法执行完毕,或者由于异常而终止时,线程进入终止状态。此时,线程的生命周期结束,无法再被启动。New -> start() -> Runnable
Runnable -> (scheduler) -> Running
Running -> (wait for lock) -> Blocked
Running -> (wait) -> Waiting
Waiting -> (notify) -> Runnable
Running -> (sleep) -> Timed Waiting
Timed Waiting -> (timeout) -> Runnable
Running -> (end) -> Terminated
线程的状态转换是多线程编程中非常重要的概念,理解这些状态及其转换有助于更好地管理和优化线程的使用。在实际开发中,合理使用线程的状态可以提高程序的性能和响应能力。