Java线程6种状态
在Java中,线程(Thread)可以处于以下6种状态之一,这些状态在java.lang.Thread.State
枚举中定义:
-
NEW(新建):线程已经被创建,但是还没有调用
start()
方法。 -
RUNNABLE(可运行):线程正在Java虚拟机中执行。它可能正在运行,也可能正在等待CPU资源分配以运行。此状态包括传统的“就绪(Ready)”状态和“运行(Running)”状态。
-
BLOCKED(阻塞):线程被阻塞,等待监视器锁(monitor lock),以进入一个同步块/方法,或者在调用了
Object.wait()
之后,重新进入同步块/方法。 -
WAITING(等待):线程无限期地等待另一个线程执行特定操作。例如,调用了
Object.wait()
(没有超时值)的线程、调用了Thread.join()
(没有指定超时值)的线程,或者LockSupport.park()
的线程。 -
TIMED_WAITING(计时等待):线程等待另一个线程执行一个(有时间限制的)动作。例如,调用了
Thread.sleep()
、Object.wait()
(带有超时值)、Thread.join()
(带有超时值),或者LockSupport.parkNanos()
/LockSupport.parkUntil()
的线程。 -
TERMINATED(终止):线程已经退出,无法再次启动。
Java线程的工作原理
线程的调度是由Java虚拟机(JVM)和/或操作系统共同管理的。当一个线程处于RUNNABLE状态时,它可能正等待操作系统分配给它CPU时间,一旦分配到CPU时间,JVM就会选择一个线程来运行。线程调度通常不是由Java代码直接控制的,而是由操作系统根据其调度算法进行处理。
当线程执行同步代码块时,它可能因为对象锁而处于BLOCKED状态。如果线程需要等待某个条件成立,它可以通过调用Object.wait()
方法进入WAITING状态。当其他线程调用相同对象的notify()
或notifyAll()
时,它可以从WAITING状态退出。TIMED_WAITING状态类似,但有时间限制。
一旦线程的run()
方法执行完成,线程会自动进入TERMINATED状态。
Java创建线程的方式
在Java中,创建和启动一个新线程主要有两种方式:
- 继承Thread类
public class MyThread extends Thread {
@Override
public void run() {
// 执行任务的代码
}
public static void main(String[] args) {
MyThread t = new MyThread();
t.start(); // 启动线程
}
}
- 实现Runnable接口
public class MyRunnable implements Runnable {
@Override
public void run() {
// 执行任务的代码
}
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
t.start(); // 启动线程
}
}
推荐使用第二种方式实现Runnable
接口,因为这样可以保留类的继承链,更加灵活。Java 8 引入的Lambda表达式可以使这一过程更加简洁:
new Thread(() -> {
// 执行任务的代码
}).start();
此外,Java还提供了java.util.concurrent
包中的高级并发API,如ExecutorService
和ThreadPoolExecutor
,它们可以用来管理线程池,更加高效地执行并发任务。