一、线程的生命周期
历程与线程一样,都具有肯定的生命周期,线程的生命周期包括四个状况:建立状况、停当状况、阻塞状况、殒命状况。
1.建立状况
1)是指运用new实例化一个线程对象,但该线程对象还未运用start()要领启动线程这个阶段,该阶段只在内存的堆中为该对象的实例变量分配了内存空间,但线程还没法介入争夺CPU的运用权;
2)建立终了线程对象后,启动该线程对象的是start()要领,而不是run()要领。
2.停当状况
1)是指一个线程对象运用start()要领后到运转完run()要领的这个阶段,线程一旦就进入停当阶段,Java假造机为该线程建立要领的挪用栈和计数器等;
2)在某一单元时候(时候片)内,CPU只能运转一个线程,一但一个线程具有了CPU的运用权,则该线程也可称为正在运转状况;
3)通常处于停当状况的线程都被视为运动的,能够运用isAlive()要领测试线程是不是处于停当状况,运用activeCount()查询当前线程地点线程池的运动线程数;
4)处于停当状况的线程并非运转状况,在之前的计算机许多都是单处理器的,要在统一时候运转一切处于停当状况的线程是不可能的,Java经由过程一些调理算法来保证这些线程同享运用处理器(如时候片轮转算法、独有算法等)。
3.阻塞状况:
1)阻塞状况包括四种状况(就寝状况、阻塞状况、挂起状况、守候状况),一般来说,阻塞状况和停当状况能够互相切换的;
2)运用sleep()要领能够线程进入就寝状况,让其他历程获得运转时机,然则用sleep要领必需捕捉InterruptedExecption非常;
3)运用suspend要领能够挂起线程(jdk1.2后已过期)、运用wait要领使线程进入守候状况(背面有一随笔会特地写)、运用I/O中断让线程进入阻塞状况。
4.殒命状况:
1)一旦线程运转完run要领,线程即进入殒命状况,Java假造时机烧毁处于殒命状况的线程对象所占用的系统资源;
2)线程执行时碰到一个未捕捉的非常,线程会被停止并进入殒命状况;挪用stop要领也能够让线程进入殒命状况,然则轻易形成死锁,已弃用。
5.线程生命周期如下图:
二、下面是sleep要领使线程进入就寝状况的案例
/** * @author: PrincessHug * @date: 2019/4/12, 9:20 * @Blog: https://www.cnblogs.com/HelloBigTable/ */ public class SleepDemo implements Runnable{ @Override public void run() { long l; for (int i=1;i<6;i++){ l = System.currentTimeMillis(); try { Thread.currentThread().sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } l = (System.currentTimeMillis() - l); System.out.println(Thread.currentThread().getName() + "线程执行了" + i + "次,耗时" + l + "毫秒。"); } } } public class SleepDriver { public static void main(String[] args) { SleepDemo sd = new SleepDemo(); for (int i=0;i<50;i++){ new Thread(sd,i + "#").start(); } } }
下面是部份运转效果截图:
能够看到假如同时启动的线程越多,会致使每一个线程的耗时越长。
以上就是Java线程的生命周期的引见(附示例)的细致内容,更多请关注ki4网别的相干文章!