生也有涯,知也无涯。这篇文章主要讲述Java技术指南「难点-核心-遗漏」Java线程状态流转及生命周期的技术指南(知识点串烧)!相关的知识,希望能为你提供帮助。
前提介绍
线程状态流转及生命周期
文章图片
生命周期的六种状态
public enum State {
/**
* Thread state for a thread which has not yet started.
*/
NEW,/**
* Thread state for a runnable thread.A thread in the runnable
* state is executing in the java virtual machine but it may
* be waiting for other resources from the operating system
* such as processor.
*/
RUNNABLE,/**
* Thread state for a thread blocked waiting for a monitor lock.
* A thread in the blocked state is waiting for a monitor lock
* to enter a synchronized block/method or
* reenter a synchronized block/method after calling
* {@link Object#wait() Object.wait}.
*/
BLOCKED,/**
* Thread state for a waiting thread.
* A thread is in the waiting state due to calling one of the
* following methods:
* <
ul>
*<
li>
{@link Object#wait() Object.wait} with no timeout<
/li>
*<
li>
{@link #join() Thread.join} with no timeout<
/li>
*<
li>
{@link LockSupport#park() LockSupport.park}<
/li>
* <
/ul>
*
* <
p>
A thread in the waiting state is waiting for another thread to
* perform a particular action.
*
* For example, a thread that has called <
tt>
Object.wait()<
/tt>
* on an object is waiting for another thread to call
* <
tt>
Object.notify()<
/tt>
or <
tt>
Object.notifyAll()<
/tt>
on
* that object. A thread that has called <
tt>
Thread.join()<
/tt>
* is waiting for a specified thread to terminate.
*/
WAITING,/**
* Thread state for a waiting thread with a specified waiting time.
* A thread is in the timed waiting state due to calling one of
* the following methods with a specified positive waiting time:
* <
ul>
*<
li>
{@link #sleep Thread.sleep}<
/li>
*<
li>
{@link Object#wait(long) Object.wait} with timeout<
/li>
*<
li>
{@link #join(long) Thread.join} with timeout<
/li>
*<
li>
{@link LockSupport#parkNanos LockSupport.parkNanos}<
/li>
*<
li>
{@link LockSupport#parkUntil LockSupport.parkUntil}<
/li>
* <
/ul>
*/
TIMED_WAITING,/**
* Thread state for a terminated thread.
* The thread has completed execution.
*/
TERMINATED;
}
新建(new Thread)
- 当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。
- 使用new创建一个线程对象,仅仅在堆中分配内存空间,在调用start方法之前。 新建状态下,线程压根就没有启动,仅仅只是存在一个线程对象而已.Thread t = new Thread();
- 此时t就属于新建状态当新建状态下的线程对象调用了start方法,此时从新建状态进入可运行状态.线程对象的start方法只能调用一次,否则报错:IllegalThreadStateException.
Threadt1=new Thread();
可运行(runnable)就绪状态运行状态
- 被转换成Terminated状态,比如调用 stop() 方法;
- 被转换成Blocked状态,比如调用了sleep, wait 方法被加入 waitSet 中;
- 被转换成Blocked状态,如进行 IO 阻塞操作,如查询数据库进入阻塞状态;
- 被转换成Blocked状态,比如获取某个锁的释放,而被加入该锁的阻塞队列中;
- 该线程的时间片用完,CPU 再次调度,进入Runnable状态;
- 线程主动调用 yield 方法,让出 CPU 资源,进入Runnable状态
t1.start();
运行(running)他也从属于Runnable状态,但不在总体状态之内,属于逻辑状态机制注意:
文章图片
堵塞(blocked)阻塞状态的两种情况:
- 当A线程处于运行过程时,试图获取同步锁时,却被B线程获取.此时JVM把当前A线程存到对象的锁池中,A线程进入阻塞状态.
- 当线程处于运行过程时,发出了IO请求时,此时进入阻塞状态.
文章图片
- 被转换成Terminated状态,比如调用 stop() 方法,或者是 JVM 意外 Crash;
- 被转换成Runnable状态,阻塞时间结束,比如读取到了数据库的数据后;
- 完成了指定时间的休眠,进入到Runnable状态;
- 正在wait中的线程,被其他线程调用notify/notifyAll方法唤醒,进入到Runnable状态;
- 【Java技术指南「难点-核心-遗漏」Java线程状态流转及生命周期的技术指南(知识点串烧)!】线程获取到了想要的锁资源,进入Runnable状态;
- 线程在阻塞状态下被打断,如其他线程调用了interrupt方法,进入到Runnable状态;
- 当线程处于运行过程时,调用了wait()方法,此时JVM把当前线程存在对象等待池中.
- 当线程处于运行过程时,调用了wait(long time)方法,此时JVM把当前线程存在对象等待池中.
- :当前线程执行了sleep(long time)方法.
- 正常执行完run方法而退出(正常死亡).
- 遇到异常而退出(出现异常之后,程序就会中断)(意外死亡).
- JVM 异常结束,所有的线程生命周期均被结束。
- void suspend() :暂停当前线程
- void resume():恢复当前线程
- void stop():结束当前线程
文章图片
推荐阅读
- pulsar bookies清理磁盘方法
- 生产制造ERP系统的功能是什么()
- app 自动化测试 - 多设备并发 -appium+pytest+ 多线程
- [C语言小白]三子棋小程序
- 从源码角度分析 MyBatis 工作原理
- vCenter Server 7.0 Update 1在部署阶段2无法保存IP配置导致部署失败
- OpenHarmony HDF 驱动框架介绍和驱动加载过程分析
- 如何避免WordPress主题升级更改我的父主题functions.php()
- 每个产品摘要后,如何在WooCommerce上添加单独的html代码