线程的状态

硅谷探秘者 2680 0 0


线程共包括以下5种状态。

1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。

2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。

3. 运行状态(Running) : 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。

4. 阻塞状态(Blocked)  : 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

    (01) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。

    (02) 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。

    (03) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5. 死亡状态(Dead)    : 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

 image.png

image.png

各种状态一目了然,值得一提的是"blocked"这个状态:

线程在Running的过程中可能会遇到阻塞(Blocked)情况


1.调用join()和sleep()方法,sleep()时间结束或被打断,join()中断,IO完成都会回到Runnable状态,等待JVM的调度。

2..调用wait(),使该线程处于等待池(wait blocked pool),直到notify()/notifyAll(),线程被唤醒被放到锁定池(lock blocked pool ),释放同步锁使线程回到可运行状态(Runnable)

3.对Running状态的线程加同步锁(Synchronized)使其进入(lock blocked pool ),同步锁被释放进入可运行状态(Runnable)。

此外,在runnable状态的线程是处于被调度的线程,此时的调度顺序是不一定的。Thread类中的yield方法可以让一个running状态的线程转入runnable。



评论区
请写下您的评论...
暂无评论...
猜你喜欢
official 833 线五种基本:初始化、可运行、运行、阻塞、终止阻塞分为:等待阻塞、同步阻塞、其他阻塞三种方式等待阻塞:调用某锁对象wait方法可使当前线进入等待阻塞,并且该线放弃所有资源(包括
official 831 《操作系统》进三种基本一次执行。在这个执行过中,有时进正在被CPU处理,有时又需要等待cPu服务,可见,进是会有各种变化。为了方便对各个进管理,操作系统需要将进
java基础 2170 中断,但是不会终止当前线运行,那么此线终止不终止还是取决于线代码。isInterrupted():该方法用来判断某线终端,返回true/falseinterrupted():
java基础 7285 线带来问题:线有时候回和其他线共享一些资源,比如内存、数据库等。当多个线同时读写同一份共享资源时候,可能会发生冲突。这时候,我们就需要引入线“同步”机制,即各位线之间要有顺序使用
java基础 2987 1.什么是线通信线之间通信两个基本问题是互斥和同步。线同步是指线之间所具有一种制约关系,一个线执行依赖另一个线消息,当它没有得到另一个线消息时应等待,直到消息到达时才被唤醒
weblog 1021 根本区别:进是操作系统资源分配基本单位,而线是处理器任务调度和执行基本单位。包含关系:一个进内可以有多个线(默认有一个主线),线是进一部分,必须依赖于进而存在,不能独立存在。资源共享:进之间是不共享资源,多个线之间是共享资源,所以存在资源竞争问题。
linux系统 1904 docker容器命令一览表
java基础 5396 (Runnabletarget,Stringname)。方法:start:启动线。yield:注意这是一个静方法。使当前运行线释放处理器资源。sleep:这也是一个静方法,即使当前运行线休眠millis毫秒join:
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。