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

2020-03-17 18:01:47 浏览数 (1)

六种线程状态

线程有如果按照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. 线程执行的所有状态分析图

0 人点赞