java interrupt Java线程的interrupt不是你想停就能停,这招让你一招毙命
2026/9/2 9:21:03 网站建设 项目流程

操作系统里, 线程与进程属于极为重要的基本概念之一, JVM线程在Java面试当中常常会被问到。Java线程虽由JVM进行管理, 然而其最终却映射到了操作系统内核线程那儿, 由操作系统也就是OS来达成线程的切换, 线程可以得到调度, 并且能把线程任务分配到CPU上去执行。

本文着重探讨Java线程的生命周期, 并且, 其情况与操作系统的线程概念也是大体相同的。

Java线程有哪些状态?

线程具有总共5种状态, 它们分别依次是, 初始状态也就是New, 就绪状态,运行状态, 阻塞状态, 以及死亡状态即Dead。

初始状态(New): 启用 new ()这个方法去崭新地创建出一个线程。对于这个线程而言, 其实现的途径分成了两种样式, 其一乃是进行继承类的操作, 其二则是实现接口方面的做法, 不论这其中通过何种途径去实现, 只要是运用new这种方式了, 那么就向着初始状态迈进。

处在就绪状态的线程, 也被叫做可执行状态, 当线程对象调用了start()方法之后, 就会进入到就绪状态, 处于这种状态下的线程, 准备去抢占CPU资源。

执行状态是这样的: 线程拿到CPU执行权, 或者说被OS选中之后, 它就进入了运行状态。

阻塞状态(), 此状态乃是这般含义, 即线程因某些缘由而舍弃 CPU 使用权, 暂时性地停下执行。线程要从阻塞状态步入就绪状态之后, 方才有机会转向执行状态。

线程处于死亡状态(Dead), 当线程任务执行完毕, 或者以异常的方式退出了run()方法时, 该线程就会结束其生命周期。

当情形是线程正处于开展某种时长无法确定的任务之际, Java便会将CPU的执行权予以收回, 进而能够合理地运用CPU的资源。存在三种情形会致使执行线程进入阻塞状态。

(1)执行的线程, 执行wait()方法时, 会出现等待阻塞, 此时JVM会将该线程, 放入等待集(Wait Set)中。

(2)同步阻塞意味着, 当一个正在执行的线程, 去获取某个对象的同步锁时, 要是这个同步锁此时正被其他线程占用着, 那么JVM就会将这个线程, 放置到入口集(Entry Set)之中。

(3)其他情形下, 当正在执行的线程执行sleep()方法, 或者执行join()方法, 又或者发出了某个I/O请求时, JVM会将该线程设置为堵塞状态。

线程若进入了阻滞状态, 那如何再度转向可执行状态呢? 由所示的那个图形里面可知, 线程在阻滞的进程完结之后, 会步入就绪状态, 用于预备再次去争抢CPU资源。在不同的情形之下, 阻滞的线程进入就绪状态的条件也存在着差异。

(1)让线程处于等待阻塞状态: 在进入到这样的状态之后, 线程没办法凭借自身主动将自己唤醒, 必定要依靠别的线程去调用(), 或者是凭借()这个方法, 才能够被唤醒过来, 线程一旦被唤醒了之后, 就会进入到Entry Set, 去等待着获取锁。

(2)同步阻塞的线程, 当线程进入Entry Set后, Entry Set里或许已然存在其它线程正等待获取锁, 此时处于Entry中Set的线程呈现先到先得的队列状态, 而线程一旦获得锁, 便会转入就绪状态。

(3)其他处于阻塞状态的线程, 在sleep方法结束时, 或者join方法完成后, 又或是IO操作执行完毕后, 线程会再次进入就绪状态, 进而等待系统去分配时间片。

执行状态转移为就绪状态

假如正在执行里的线程调用了yield()方法, 这表明它舍弃了当下所获取的CPU时间片, 进而回到就绪状态, 和其它的线程处于同样竞争的态势, 去等待操作系统下一次进行调度以后让这个线程进入到执行状态。

时不时会发表出自个人对 IT 产业的不同看法, 还会用颇为简单的语言来讲清楚那些复杂异常的技术, 针对物联网、云原生以及数字科技方面持续不断地更新文章, 期待大家的关注, 多谢。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询