面试题答案
一键面试线程生命周期的状态
- 新建(New):当一个
Thread
类或其子类的对象被创建时,线程就进入了新建状态,但此时线程还未开始运行。例如:Thread thread = new Thread(() -> System.out.println("Hello from thread"));
- 就绪(Runnable):调用
start()
方法后,线程进入就绪状态。此时线程等待CPU分配时间片,一旦获得CPU资源,就可以执行。例如:thread.start();
- 运行(Running):线程获得CPU时间片开始执行
run()
方法中的代码。 - 阻塞(Blocked):
- 等待阻塞:调用
Object
类的wait()
方法,线程会进入等待阻塞状态,直到其他线程调用notify()
或notifyAll()
方法唤醒它。例如:
- 等待阻塞:调用
Object lock = new Object();
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
- **同步阻塞**:当线程试图访问一个同步代码块,而该代码块正被其他线程占用时,线程会进入同步阻塞状态,直到获取到锁。例如:
synchronized (this) {
// 同步代码块
}
- **其他阻塞**:调用`Thread.sleep(long millis)`方法,线程会进入其他阻塞状态,在指定时间内不会获得CPU执行权。例如:`Thread.sleep(1000);`
5. 死亡(Terminated):线程执行完run()
方法正常结束,或者因未捕获的异常而终止,线程进入死亡状态。例如:
Thread thread = new Thread(() -> {
// 执行任务
});
thread.start();
// 线程执行完毕后进入死亡状态
状态转换
- 新建 -> 就绪:调用
start()
方法。 - 就绪 -> 运行:获得CPU时间片。
- 运行 -> 阻塞:调用
wait()
、sleep()
方法,或尝试获取同步锁失败等情况。 - 阻塞 -> 就绪:
wait()
线程被notify()
或notifyAll()
唤醒,sleep()
时间结束,获取到同步锁等情况。 - 运行 -> 死亡:
run()
方法执行完毕或抛出未捕获异常。