本教程操作环境:windows7系统、Dell G3电脑。 线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。完整的生命周期图如下: 当线程进入运行状态后,一般的操作系统是采用抢占式的方式来让线程获得CPU。所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞、就绪之间切换。 1、新建(new) 新建:使用new方法,new出来线程,此时仅仅由JAVA虚拟机为其分配内存,并初始化成员变量的值。此时仅仅是个对象。 2、就绪(runnable) 就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行; 3、运行(running) 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;(当处于就绪状态的线程获得CPU,它就会执行run()方法) 4、阻塞(blocked) 阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态。原因如下: 1.等待I/O流的输入输出 2.等待网络资源,即网速问题 3.调用sleep()方法,需要等sleep时间结束 4.调用wait()方法,需要调用notify()唤醒线程 5.其他线程执行join()方法,当前线程则会阻塞,需要等其他线程执行完。 状态切换图如下: 5、销毁(terminated) 如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源。 1、run()/call()方法执行完成,线程正常结束; 扩展知识:CPU时间片 操作系统层面有个晶振,有点像和尚在不停的撞钟,每隔很短很短的一段时间撞一次,将CPU的时间拆成一个一个的时间片;各个线程其实是不停的去抢一个个的时间片;时间片到点后,还是要重新抢(保证所有的线程都有机会抢到CPU去执行自己的逻辑;公平性) 新建状态 我们来看下面一段代码: Thread t1 = new Thread(); 这里的创建,仅仅是在JAVA的这种编程语言层面被创建,而在操作系统层面,真正的线程还没有被创建。只有当我们调用了 start() 方法之后,该线程才会被创建出来,进入Runnable状态。只有当我们调用了 start() 方法之后,该线程才会被创建出来 更多相关知识,请访问常见问题栏目! |