欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

线程的生命周期和控制

程序员文章站 2022-03-13 17:04:53
一、线程的生命周期 进程与线程一样,都具有一定的生命周期,线程的生命周期包括四个状态:创建状态、就绪状态、阻塞状态、死亡状态。 1.创建状态 1)是指使用new实例化一个线程对象,但该线程对象还未使用start()方法启动线程这个阶段,该阶段只在内存的堆中为该对象的实例变量分配了内存空间,但线程还无 ......

一、线程的生命周期

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

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

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

线程的生命周期和控制

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