详解JAVA 线程-线程的状态有哪些?它是如何工作的?
线程的状态
Java中的线程状态通常分为以下几种:
- NEW(新建):新创建了一个线程对象,但还没有调用其start()方法
- RUNNABLE(可运行):运行状态。线程对象创建后,其他线程调用了该对象的start()方法,该状态的线程位于等待运行队列中,等待获取CPU的使用权
- BLOCKED(阻塞):线程的阻塞状态。表示线程的阻塞状态,它在等待锁的时候就是这个状态
- WAITING(等待):线程的等待状态。进入该状态表示当前线程需要等待其他线程做出了一些特定动作(通知、中断等)
- TIMED_WAITING(计时等待):具有等待时间的等待状态。进入该状态时会等待一段时间,等时间结束或者接收到通知、中断时会重新进入RUNNABLE状态
- TERMINATED(终止):线程的终止状态。表示该线程已经执行完毕
线程的工作原理
线程是进程中的执行单元,一个进程可以拥有多个线程,每个线程都是独立的,拥有自己的栈、程序计数器和局部变量等。
当线程被创建后,会在内存中分配线程所需要的资源,然后进入NEW状态。当其他线程调用该线程启动方法(start())后,该线程进入RUNNABLE状态,在等待CPU调度的时候位于等待运行队列中。线程调度器会根据调度算法从等待运行队列中选取一个线程,将其转为RUNNING状态并开始执行线程的run()方法。当该线程的run()方法执行结束后,线程进入TERMINATED状态。
在线程的执行过程中,线程可能会进入BLOCKED、WAITING或TIMED_WAITING状态,这些状态的具体原因各异,大多数情况下是因为线程需要等待一些条件的触发(如等待锁、等待输入、等待定时器等)。当条件得到满足后,线程会重新进入RUNNABLE状态,等待CPU调度。
示例说明
示例一
public class ThreadExample1 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " is running!");
}
public static void main(String[] args) {
Thread thread = new Thread(new ThreadExample1());
System.out.println(thread.getState()); //NEW
thread.start();
System.out.println(thread.getState()); //RUNNABLE
}
}
在示例一中,我们创建了一个实现了Runnable接口的线程类ThreadExample1。在该类的main方法中,我们创建了一个Thread对象并调用start()方法,这将导致该线程进入RUNNABLE状态。在调用start()方法之前,该线程处于NEW状态。
示例二
public class ThreadExample2 implements Runnable {
private Object lock = new Object();
@Override
public void run() {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new ThreadExample2());
System.out.println(thread.getState()); //NEW
thread.start();
System.out.println(thread.getState()); //RUNNABLE
Thread.sleep(1000); //等待1秒钟,确保线程已经进入WAITING状态
System.out.println(thread.getState()); //WAITING
}
}
在示例二中,我们创建了一个实现了Runnable接口的线程类ThreadExample2。在该类的run方法中,我们使用synchronized关键字进行同步并在lock上等待,这将导致该线程进入WAITING状态。
在main方法中,我们创建了一个Thread对象并调用start()方法,这将导致该线程进入RUNNABLE状态。在start()方法调用之前,该线程处于NEW状态。由于该线程需要等待条件的满足,因此我们调用了Thread.sleep()方法等待1秒钟,以确保该线程已经进入WAITING状态。在等待过程中,我们可以通过getState()方法获取该线程的状态,此时该线程应该处于WAITING状态。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JAVA 线程-线程的状态有哪些?它是如何工作的? - Python技术站