### 状态和生命周期的概念

在Java中,线程是程序执行的最小单元,它可以并发地执行不同的任务。线程的状态和生命周期描述了线程在不同阶段的行为和状态变化。当线程创建后,它可以经历多个状态,包括新建、就绪、运行、阻塞和终止等。线程的生命周期指的是线程从创建到终止的整个过程。

### 线程的状态

Java线程具有以下几种状态:

1. 新建状态(New):当线程对象被创建时,它处于新建状态。这个线程对象已经在内存中分配了空间,但尚未开始执行。
2. 就绪状态(Runnable):当线程被start()方法调用时,线程将进入就绪状态。就绪状态的线程等待获取CPU时间片来执行。在就绪状态中,线程可能被系统的线程调度机制选择为下一次运行的线程。
3. 运行状态(Running):当获取到CPU时间片后,线程进入运行状态,开始执行其中的任务。
4. 阻塞状态(Blocked):线程进入阻塞状态是因为某种原因需要暂停执行,常见的情况包括等待输入/输出、等待获取锁和等待其他线程完成等。当阻塞条件解除时,线程会重新进入就绪状态。
5. 终止状态(Terminated):线程在任务执行完成或出现异常等情况下,将进入终止状态,停止执行。

### 线程的生命周期

线程的生命周期可以分为以下几个阶段:

1. 创建(New):线程对象被创建后,处于新建状态。
2. 就绪(Runnable):线程调用start()方法后,进入就绪状态,表示线程可以被系统调度执行。
3. 运行(Running):线程获得CPU时间片后,进入运行状态,开始执行其中的任务。
4. 阻塞(Blocked):线程在某些情况下会进入阻塞状态,等待特定条件满足后才能继续执行。
5. 终止(Terminated):线程执行完任务或者出现异常等情况下,线程将进入终止状态,停止执行。

一个线程只能被创建一次,并且只能启动一次,一旦线程进入终止状态,就不能再次启动。

### 示例代码

下面是一个简单的Java代码示例,演示了线程的状态和生命周期:

```java
public class ThreadExample extends Thread {
@Override
public void run() {
System.out.println("线程正在运行");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程执行完成");
}

public static void main(String[] args) {
ThreadExample thread = new ThreadExample();
System.out.println("线程创建完毕");
thread.start();
System.out.println("线程启动完毕");
}
}
```

1. 创建状态:线程对象`thread`被创建,处于新建状态。
2. 就绪状态:线程调用`start()`方法后进入就绪状态。
3. 运行状态:线程获取到CPU时间片后进入运行状态,执行`run()`方法中的任务。
4. 阻塞状态:使用`Thread.sleep()`方法使线程进入阻塞状态,等待2秒钟。
5. 终止状态:线程任务执行完成后进入终止状态,线程结束执行。

以上是对线程状态和生命周期的基本理解,理解线程的状态和生命周期可以帮助我们更好地管理和控制多线程程序的执行。