知识点——java中线程的状态简说

六种线程状态

线程有如果按照java.lang.Thread.State枚举方式来考虑,一共提供了6中状态

状态导致状态的发生条件
NEW(新建)线程刚刚被创建,没有启动,没有调用start方法
RUNNABLE(可运行)线程已经可以在JVM中运行,但是是否运行不确定,看当前线程是否拥有CPU执行权
BLOCKED(锁阻塞)当前线程进入一个同步代码需要获取对应的锁对象,但是发现当前锁对象被其他线程持有,当前线程会进入一个BLOCKED。如果占用锁对象的线程打开锁对象,当前线程持有对应锁对象,进入Runnable状态
WAITING(无限等待)通过一个wait方法线程进入一个无限等待状态,这里需要另外一个线程进行唤醒操作。进入无限等待状态的线程是无法自己回到Runnable状态,需要其他线程通过notify或者notifyAll方法进行唤醒操作
TIMED_WAITING(计时等待)当前线程的确是等待状态,但是会在一定时间之后自动回到Runnable状态,例如 Thread.sleep() 或者是Object类内的wait(int ms);
TERMINATED(被终止)因为Run方法运行结束正常退出线程,或者说在运行的过程中因为出现异常导致当前线程GG思密达
1. TIMED_WAITING(计时等待)

在这里插入图片描述

Thread.sleep(int ms);
在对应线程代码块中,当前线程休眠指定的时间。

Object类内 wait(int ms);
让当前线程进入一个计时等待状态
1. 规定的时间及时完毕,线程回到可运行状态
2. 在等待时间内,通过其他线程被notify或者notifyAll唤醒

Sleep方法
1. 调用之后休眠指定时间
2. sleep方法必须执行在run方法内,才可以休眠线程
3. sleep不会打开当前线程占用的锁对象。

2. BLOCKED(锁阻塞)

在这里插入图片描述

线程中有锁存在,线程需要进入带有锁操作的同步代码,如果锁对象被别人持有,只能在锁外等待

锁阻塞状态的线程是否能够抢到锁对象有很多因素
1. 优先级问题,非决定因素
2. CPU执行概率问题。

后期高并发一定会存在多线程操作锁对象问题,秒杀,抢购…
队列方式来处理

3. 线程状态 WAITING(无限等待)

在这里插入图片描述
当某一个线程被执行wait()方法,需要等待另外的一个线程进行唤醒操作。

以下三个方法都是Object类内的方法:
public void wait();
在哪一个线程中执行,就会让当前线程进入一个无限等待状态。
1. 所在线程进入无限等待状态
2. 开启【锁对象】

public void notify();
唤醒和当前锁对象有关的无限等待线程中的一个,随机选择。
1. 唤醒一个无限等待状态线程
2. 开启【锁对象】

public void notifyAll();
唤醒所有和当前锁对象有关的无限等待线程
1. 唤醒所有线程
2. 开启【锁对象】
3. 线程进入锁对象抢占过程,就有可能进入一个锁阻塞状态。

4. 线程执行的所有状态分析图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值