Java程序中的线程有以下几种状态:
1.New(新建状态)
当线程对象被创建但未启动时,线程处于新建状态。此时线程并没有真正的创建,只是为线程分配了必要的资源,并初始化了其内部属性。
2.Runnable(就绪状态)
当线程对象调用start()方法后,线程就进入了可运行状态。此时线程已经准备好运行,但是需要等待系统调度,以便分配处理器资源。
3.Running(运行状态):
当CPU资源分配给线程时,线程进入运行状态。此时,线程才真正开始执行run()方法中的代码。
4.Blocked(阻塞状态)
线程在运行过程中,如果被其它线程或者同步锁阻塞,就会进入阻塞状态。当条件满足时,阻塞状态的线程会转换为可运行状态。
5.Waiting(等待状态)
线程在执行wait()、join()等方法,或者调用LockSupport.park()方法时,会进入等待状态。只有当另一个线程执行notify()、notifyAll()或者interrupt()方法时,线程才会被唤醒。
6.Timed Waiting(计时等待状态)
线程在执行sleep()、wait(long)、join(long)等方法时,会进入计时等待状态。只有当指定的时间到了,或者另一个线程执行notify()、notifyAll()方法时,线程才会被唤醒。
7.Terminated(终止状态)
线程会以以下三种方式之一结束,结束后就处于死亡状态:
- run()方法执行完成,线程正常结束
- 线程抛出一个未捕获的Exception或Error
- 直接调用该线程的stop()方法来结束该线程
下面是一个Java线程生命周期的示例代码:
public class ThreadLifeCycleExample implements Runnable {
public void run() {
System.out.println("线程开始执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程执行完毕");
}
public static void main(String[] args) {
Thread thread = new Thread(new ThreadLifeCycleExample());
System.out.println("线程状态:" + thread.getState()); // 新建状态
thread.start();
System.out.println("线程状态:" + thread.getState()); // 就绪状态
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程状态:" + thread.getState()); // 运行状态
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程状态:" + thread.getState()); // 终止状态
}
}