线程的生命周期可以分为五个:
新建、可执行(就绪)、运行、阻塞、死亡
新建: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()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
线程的生命周期包括新建、就绪、运行、阻塞和死亡五个阶段。当调用start方法后,线程进入就绪状态,开始竞争CPU资源。运行中的线程可能因sleep、wait、join或锁竞争进入阻塞状态。线程死亡通常发生在run方法执行完毕或抛出异常时。yield方法使线程让步,但并不保证效果。
4368





