Java线程的6种状态及切换教程
Java是一种多线程编程语言,线程作为Java应用程序的基本执行单元,线程状态经常改变。正因为Java线程状态的改变,在多线程程序中使用线程,需要了解线程的6种状态及状态转换。本文将通过以下几个方面详细讲解Java线程的6种状态及状态转换的教程。
Java线程的6种状态
Java线程共有6种状态,分别是:
- NEW(新建):线程被创建但尚未开始执行的状态。
- RUNNABLE(就绪):线程执行所需的所有资源已准备就绪,线程等待调度执行的状态。
- BLOCKED(阻塞):线程正在等待获取锁对象,此时其他线程获取到锁对象,并且线程的等待时间未到,线程会处于阻塞状态。
- WAITING(等待):线程等待其他线程执行完成,进入等待状态。
- TIMED_WAITING(定时等待):线程等待其他线程执行完成在指定时间内,定时等待状态。
- TERMINATED(终止):线程执行完成或被中断结束的状态。
Java线程状态的转换
不同状态的线程可以相互转换。Java线程状态转换的条件如下:
- 新建状态转换为可运行状态:调用线程start() 方法。
- 就绪状态转换为运行状态:获得cpu时间片,开始执行代码。
- 运行状态转换为就绪状态:当前线程的时间片用完或者线程sleep() 方法执行完毕。
- 运行状态转换为阻塞状态:线程在synchronized()方法上未获得锁的情况下执行wait()或者别的类似方法时,线程就会进入阻塞状态。
- 阻塞状态转换为就绪状态:线程获得锁并执行notify或者notifyAll()方法,线程返回就绪状态。
- 运行状态和就绪状态线程转化为等待或者定时等待线程:执行wait()或sleep(time)或join(time)方法,进入等待或定时等待状态。
- 等待或定时等待线程状态转换为就绪状态:等待或定时等待时间到,或唤醒该线程。
Java线程状态转换示例
示例1:线程转换为阻塞状态
public class Demo1 implements Runnable {
public synchronized void run() {
try {
System.out.println(Thread.currentThread().getName()
+ "占用资源,等待5s");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception{
Demo1 demo1 = new Demo1();
Thread t1 = new Thread(demo1, "线程1");
Thread t2 = new Thread(demo1, "线程2");
t1.start();
Thread.sleep(1000);
t2.start();
}
}
运行结果:
线程1占用资源,等待5s
线程2占用资源,等待5s
我们会发现线程2没有在开始执行,而是正在等待资源,则在这个过程中线程2就处于阻塞状态了。
示例2:线程转换为等待状态
public class Demo2 {
public static void main(String[] args) throws Exception{
Object object = new Object();
Thread t1 = new Thread(() -> {
synchronized (object) {
try {
System.out.println(Thread.currentThread().getName()
+ " enter waiting state");
object.wait();
System.out.println(Thread.currentThread().getName()
+ " restart execution");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "线程1");
Thread t2 = new Thread(() -> {
synchronized (object) {
System.out.println(Thread.currentThread().getName() + " notify");
object.notify();
}
}, "线程2");
t1.start();
Thread.sleep(1000L);
t2.start();
}
}
运行结果:
线程1 enter waiting state
线程2 notify
线程1 restart execution
如上,t1线程执行了object.wait()
方法,导致线程进入等待状态,同时在t2
线程中synchronized(object)
代码块调用了object.notify()
方法,唤醒了等待的线程t1
,此时t1
线程就处于就绪状态了。
总结
本文对Java线程的6种状态及状态转换进行了详细的讲解,并通过两个示例进行了演示,希望读者可以通过本文更深刻的理解Java的多线程编程思想。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程的6种状态及切换教程 - Python技术站