操作系统中一般将线程划分为五种状态:新建、可运行(就绪)、运行、阻塞、终止
-
新建(New):当一个线程被创建时,它处于新建状态。此时,线程对象已经创建,但还没有分配到CPU资源。
-
就绪(Ready):当一个线程需要执行某个任务时,它会被放入就绪队列中。就绪队列中的线程等待CPU的调度,以获取执行权限。当有其他线程释放了CPU资源,并且该线程满足执行条件时,它将从就绪队列中取出并进入可运行状态。
-
运行(Running):当一个线程被分配到CPU资源后,它就会进入运行状态。此时,线程正在执行其任务,并占用CPU资源。
-
阻塞(Blocked):当一个线程在执行过程中遇到某种情况,如等待输入、等待I/O操作完成等,它可能会暂时停止执行,进入阻塞状态。阻塞状态下的线程不会消耗CPU资源,而是等待相应的事件发生后再恢复执行。
-
终止(Terminated):当一个线程完成任务或出现异常时,它会被标记为终止状态。此时,线程不再占用任何系统资源,可以安全地结束其生命周期。
线程状态在java中定义,通过查看Thred源码 我们会发现java将线程定义了六种状态,如下图所示:
-
NEW:新建状态,表示线程刚被创建,但还没有调用start()方法。此时,线程对象已经创建,但还没有分配到CPU资源。
-
RUNNABLE:可运行状态,表示线程已经调用了start()方法,等待CPU调度。此时,线程已经分配到了CPU资源,并准备执行任务。
-
BLOCKED:阻塞状态,表示线程在等待锁的释放。当一个线程尝试获取一个已经被其他线程持有的锁时,它会被阻塞,直到该锁被释放。
-
WAITING:等待状态,表示线程正在等待某个条件的发生。例如,调用Object.wait()方法会使线程进入等待状态,直到其他线程调用Object.notify()或Object.notifyAll()方法唤醒它。
-
TIMED_WAITING:限时等待状态,表示线程正在等待某个条件的发生,并且设置了等待时间。例如,调用Thread.sleep(long millis)方法会使线程进入限时等待状态,直到指定的时间过去或者被其他线程中断。
-
TERMINATED:终止状态,表示线程已经完成任务或出现异常而结束。此时,线程不再占用任何系统资源,可以安全地结束其生命周期。
代码演示
public class Main {
public static void main(String[] args) throws InterruptedException {
// 创建一个新的线程
Thread thread1 = new Thread(()-> System.out.println("1"));
Thread thread2 = new Thread(()-> {
while (true){
}
});
thread2.start();
Thread thread3 = new Thread(()-> {
try {
synchronized (Main.class){
Thread.sleep(10000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("3");
});
thread3.start();
Thread thread4 = new Thread(()-> {
try {
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("4");
});
thread4.start();
Thread thread5 = new Thread(()-> {
synchronized (Main.class){
System.out.println("5");
}
});
thread5.start();
Thread thread6 = new Thread(()-> System.out.println("6"));
thread6.start();
thread6.join();
System.out.println(thread1.getState());
System.out.println(thread2.getState());
System.out.println(thread3.getState());
System.out.println(thread4.getState());
System.out.println(thread5.getState());
System.out.println(thread6.getState());
}
}
运行结果: