Java线程生命周期及转换过程包含如下五个状态:
-
新建状态(new)
-
就绪状态(Runnable)
-
执行状态(Running)
-
阻塞状态(Blocked)
-
终止状态(Terminated)
以下是各个状态的详细说明:
-
新建状态:这是一个线程刚被创建但是还没有被启动的状态。在此状态下,线程不会占用任何CPU时间,除非它被启动。
-
就绪状态:在此状态下,线程已经准备好执行,并等待被系统调度分配CPU时间片,即等待运行。
-
执行状态:当前系统已经开始执行线程,处于此状态。在此状态下,线程实际占用了CPU,并执行了具体的任务。
-
阻塞状态:在此状态下,线程暂时停止执行,通常是因为等待某些条件发生或者在等待某些资源。比如线程通过sleep()方法暂停执行,或者在执行IO操作时阻塞等待数据返回。
-
终止状态:线程正常或者异常终止执行,处于此状态。
转换过程:
- 线程从新建状态转换为就绪状态
当一个线程被创建时,它处于新建状态,这时可以通过start()方法启动该线程,使其进入就绪状态,等待系统分配CPU时间片。
示例1:
Thread t = new Thread(() -> {
System.out.println("Thread is running!");
});
t.start();
- 线程从就绪状态转换为执行状态
当一个线程被系统分配到CPU时间片时,它进入就绪状态,等待着调度器的调度,将其转换为执行状态。
示例2:
Thread t = new Thread(() -> {
while(true) {
System.out.println("Thread is running!");
}
});
t.start();
- 线程从执行状态转换为阻塞状态
当线程被挂起等待某些条件发生时,它会进入阻塞状态,比如通过调用sleep()方法或等待I/O操作结果时。
示例3:
Thread t = new Thread(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread is running!");
});
t.start();
- 线程从阻塞状态转换为就绪状态
当阻塞条件被满足时,线程会进入就绪状态,等待系统调度分配CPU时间片。
示例4:
Thread t1 = new Thread(() -> {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Thread is running!");
});
t1.start();
Thread t2 = new Thread(() -> {
synchronized (lock) {
lock.notifyAll();
}
});
t2.start();
- 线程从执行状态转换为终止状态
当线程执行过程中执行完成任务或者发生异常时,线程会转换为终止状态。
示例5:
Thread t = new Thread(() -> {
int a = 1 / 0;
System.out.println("Thread is running!");
});
t.start();
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程生命周期及转换过程 - Python技术站