目录
在操作系统中,每个进程至少有一个线程,而每一个线程对应一个PCB,PCB有一个叫做“进程状态”的属性,用来描述当前PCB的状态。但是在Java中,有一套独立的线程状态规则。
Java中的线程分为以下六种状态,通过线程对象调用getState()方法来获取线程的当前状态。
这个状态表示:创建了Thread对象,但还没调用start方法,此时系统上还没真正创建线程。
表示线程执行完run方法的任务后销毁了,但Thread对象还在的状态。
表示就绪状态:线程正在CPU上执行run方法的任务,或者在就绪队列中排队。
表示线程正在按照一定的时间进行阻塞,调用sleep或者join(time)方法就会进入该状态。
- public static void main(String[] args) throws InterruptedException {
- Thread thread = new Thread(()->{
- for (int i = 0; i < 1000_0000; i++) {
- ;
- }
-
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- });
- //线程调用start方法之前的状态:NEW
- System.out.println(thread.getState());
-
- thread.start();
-
- //线程执行执行run方法时的状态:RUNNABLE
- System.out.println(thread.getState());
-
- //线程按照一定时间阻塞的状态:TIMED_WAITING
- Thread.sleep(1000);
- System.out.println(thread.getState());
-
- thread.join();
- //线程执行完run方法销毁后的状态:TERMINATED
- System.out.println(thread.getState());
- }
代码运行结果:
特殊的阻塞状态,调用wait或者join()方法就会进入该状态。
等待锁的时候进入的阻塞状态,调用synchronized方法就会进入该状态。
综上,线程在运行时其实就两种状态:就绪状态和阻塞状态(根据阻塞的原因分成4、5、6三种具体情况)。
线程通过调用特定的方法,可以在就绪状态和阻塞状态之间来回转换: