线程的五个生命周期

线程的生命周期包括新建、就绪、运行、阻塞和死亡五个阶段。当调用start方法后,线程进入就绪状态,开始竞争CPU资源。运行中的线程可能因sleep、wait、join或锁竞争进入阻塞状态。线程死亡通常发生在run方法执行完毕或抛出异常时。yield方法使线程让步,但并不保证效果。

线程的生命周期可以分为五个:

新建、可执行(就绪)、运行、阻塞、死亡

新建:new一个Thread类,此时仅仅由JAVA虚拟机为其分配内存,并初始化成员变量的值,此时仅仅是个对象。这里的创建,仅仅是在JAVA的这种编程语言层面被创建,而在操作系统层面,真正的线程还没有被创建,只有当我们调用了 start方法之后,该线程才会被创建出来,进入就绪状态

就绪:Thread对象执行start方法,此时JVM才会真正新建一个线程,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行

运行:谁先抢到了cpu时间片,哪个线程就先开始执行,调用了start方法会自动执行run方法,各个线程其实是不停的去抢一个个的时间片;时间片到点后,还是要重新抢(保证所有的线程都有机会抢到CPU时间片去执行自己的逻辑,具有公平性)对于一个单核cpu(或者是一个内核)来说,只能同时执行一条指令,而JVM通过快速切换线程执行指令来达到多线程的,真正处理器就能同时处理一条指令,只是这种切换速度很快,我们根本不会感知到。为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储

阻塞:在运行的线程,调用sleep方法,sleep时间结束才会继续执行。调用wait方法,JVM会把该线程放入等待池中,需要调用notify唤醒线程。其他线程执行join方法,当前线程则会阻塞,需要等其他线程执行完。运行的线程当获取到对象锁时,若该对象锁被别的线程占用,JVM会把该线程放入锁池(阻塞队列)中。进行某个阻塞的IO操作,比如因网络数据的读写

死亡:run方法结束,抛出异常,stop方法结束线程

线程主动调用yied方法,放弃CPU执行权,进入runnable状态,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值