前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >知识点——java中线程的状态简说

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

作者头像
用户7073689
发布2020-03-17 18:01:47
6670
发布2020-03-17 18:01:47
举报
文章被收录于专栏:青柠小鱼青柠小鱼

六种线程状态

线程有如果按照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. 线程执行的所有状态分析图
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 六种线程状态
    • 1. TIMED_WAITING(计时等待)
      • 2. BLOCKED(锁阻塞)
        • 3. 线程状态 WAITING(无限等待)
          • 4. 线程执行的所有状态分析图
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档