线程的生命周期(图解)

面试题

关于线程方面的问题想必是面试时经常被问到的,所以我们来整理下关于线程的生命周期中的一些知识

线程的生命周期

在这里插入图片描述

1.新建
  新建即创建线程对象,用关键字new创建一个线程对象时,线程处于新建状态
2.就绪
   线程对象调用start()方法时,该线程处于就绪状态,此时的线程有执行资格但是却没有执行权
3.运行

如果CPU是单核,则在任一时刻都只有一个线程在执行。当线程数据大于核 数时,就会出现线程轮换。

所有桌面和服务器系统都采用的是抢占式调度策略,即当前线程在系统允许的执行时间之后,就给其他线程获得执行机会,且优先给优化级高的线程。

在运行状态下的线程有执行资格有cpu的执行权

4.阻塞

发生以下情况时,线程将进入阻塞状态:
调用sleep()方法时。此时会放弃它所占用的处理器资源。【过了sleep指定时间不再阻塞】
调用一个阻塞式IO方法还没有返回之前,该线程被阻塞。【阻塞IO方法返回后不再阻塞】
试图获取一个正被其他线程所持有的同步监视器。【拿到监听器不再阻塞】
等待通知时(notify)。【其他线程调用了notify时不再阻塞】
调用suspend()方法将程序挂起时。【线程调用resume()方法时撤销挂起时不再阻塞】

阻塞状态下的线程没有执行资格也没有cpu的执行权,但是一些操作可以把该线程激活(如notify()方法)但是激活后会返回到就绪状态

5.死亡

线程死亡情况:
线程正常结束(run或call方法执行完)

线程抛出一个未捕获的Exception或Error

线程自己调用stop()方法(该方法容易导致死锁)

线程处于死亡状态时,则此线程对象变成垃圾等待被回收

### Java 多线程生命周期图解Java中,线程生命周期由多个状态组成,这些状态反映了线程在其存在期间的不同阶段。以下是详细的线程状态及其转换过: #### 1. 新建 (New) 当`Thread`类的对象被实例化后,线程就处于新建状态。此时,序还没有调用线程对象上的`start()`方法。 #### 2. 可运行 (Runnable) 一旦调用了线程对象的`start()`方法,线程便进入了可运行的状态。这并不意味着线程立刻开始执行其任务;而是表示它现在可以由JVM调度来获取CPU资源并实际运行[^3]。 ```java // 创建一个新的线程 Thread myThread = new Thread(() -> { System.out.println("This is a runnable thread."); }); myThread.start(); // 调用 start 后进入 RUNNABLE 状态 ``` #### 3. 阻塞 (Blocked) 如果一个线程试图访问某个同步区域而该区域正被其他线程持有,则此线程会被阻塞直到锁定释放为止。这种情况下,线程暂时停止等待锁变得可用。 #### 4. 等待 (Waiting)线程调用了无参数版本的方法如`Object.wait()`, `Thread.join()`, 或者是在某些条件下调用了`LockSupport.park()`时,它们会进入等待状态。除非另一个线程显式地通知或中断当前线程,否则不会自动恢复执行。 #### 5. 计时等待 (Timed Waiting) 类似于等待状态,不过这里指的是那些设置了固定时间间隔的操作,比如带有时限参数的`wait(long timeout)`、`sleep(long millis)`等函数。即使到达指定的时间之前也可能因为接收到信号而提前退出计时等待。 #### 6. 终止 (Terminated) 这是线程完成工作的最终状态。可能是因为正常完成了工作(`run()`方法返回),也可能是遇到了未处理的异常而导致强制结束。另外,在极端情况下,整个虚拟机关闭也会使所有活动中的线程都变为终止态[^1]。 ![Java线程生命周期](https://www.example.com/java-thread-lifecycle-diagram.png) 请注意上述链接仅为示意用途,并不代表真实存在的图片地址。对于更直观的理解,建议查阅官方文档或其他权威资料以获得最新的图形展示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值