在Java中,线程可以处于不同的状态,而状态之间的转换是通过调用不同的线程方法或由操作系统进行管理的。主要的线程状态有以下几种:
1、NEW(新建):
- 当创建了一个Thread对象时,线程处于NEW状态。
- 还未调用
start()
方法。
2、RUNNABLE(可运行):
- 线程可以运行,也可能正在运行。
- 线程对象调用了
start()
方法,线程进入可运行状态。
3、BLOCKED(阻塞):
- 阻塞状态表示线程阻塞于锁。
- 当一个线程试图访问一个被其他线程持有的锁时,它就会进入阻塞状态。
4、WAITING(等待):
- 表示当前线程等待其他线程执行完特定操作。
- 例如,调用
Object.wait()
方法,或者是调用Thread.join()
方法,对应线程会从RUNNABLE状态转换为WAITING状态。
5、TIMED_WAITING(计时等待):
- 类似于等待状态,但可以在指定的时间后自行返回。
- 例如,调用
Thread.sleep(long millis)
或带有超时参数的Object.wait(),
,对应线程会从RUNNABLE状态转换为TIMED_WAITING状态。线程调用相同对象的Object.notify()
或Object.notifyAll()
方法时对应线程就会争抢锁,争抢成功的线程变成RUNNABLE状态,争抢失败的锁变成BLOCKED状态。注意:执行sleep时锁不会释放,执行wait时会释放锁。
6、TERMINATED(终止):
- 线程已经执行完毕。
- 线程正常终止、抛出一个未捕获的异常而终止或者执行了
Thread.stop()
方法。