线程的生命周期和控制

Posted hellobigtable

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程的生命周期和控制相关的知识,希望对你有一定的参考价值。

一、线程的生命周期

  进程与线程一样,都具有一定的生命周期,线程的生命周期包括四个状态:创建状态、就绪状态、阻塞状态、死亡状态。

  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(); } } }

  下面是部分运行结果截图:

技术图片

可以看到如果同时启动的线程越多,会导致每个线程的耗时越长。

以上是关于线程的生命周期和控制的主要内容,如果未能解决你的问题,请参考以下文章

线程的生命周期以及控制线程

JavaLearn# (13)多线程:线程生命周期线程控制线程同步线程通信线程池ForkJoin框架

导航上的片段生命周期重叠

Android片段生命周期:onResume调用了两次

java基础--23.线程的控制与生命周期

Android 片段生命周期