zoukankan      html  css  js  c++  java
  • java线程的生命周期(状态:new start wait sleep stop yield)

    JAVA基础知识之多线程——线程的生命周期(状态)

    线程有五个状态,分别是新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。

    新建和就绪

    程序使用new会新建一个线程,new出的对象跟普通对象一样,JVM会为其分配内存,初始化成员变量等,此时线程并没有运行,而是就是新建状态。

    当线程对象调用start后,线程将进入就绪状态。JVM会为其创建函数调度栈和计数器,但此时线程依然没有运行,而是等待获取CPU执行片

    下面的例子可以证明当线程对象调用start后,并不一定立即执行,

    1
    2
    3
    4
    5
    6
    7
    for (int i=0; i<50; i++) {
        System.out.println(Thread.currentThread().getName()+" "+i);
        if(i==20){
            SecondThread st = new SecondThread();
            new Thread(st, "new thread 1").start();
        }
    }

    上面是在main中创建子线程,下面是运行结果,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ...
     
    main 18
    main 19
    main 20
    main 21
    main 22
    new thread 1 0
    main 23
    new thread 1 1
    main 24
    new thread 1 2
    main 25
     
    ...

    从上面的运行结果可以看到,原本在main中i=20的时候新建了一个子线程,并立即调用了start()使线程进入就绪状态,但是一直等到i=22的时候,子线程才开始运行,所以子线程何时会开始执行取决于CPU执行片的分配,由JVM调度器决定。

    运行和阻塞状态

    当就绪状态的线程获取了CPU执行片的之后,就进入运行状态,但是在执行过程中,可能会因为以下原因使线程进入阻塞状态,

    • CPU执行片已经用完,JVM切换到其他线程执行
    • 线程调用sleep()
    • 线程调用了阻塞IO方法,该方法返回之前,线程会一直阻塞
    • 线程试图获取被其他线程持有的同步监视器
    • 线程在等待某个通知
    • 程序调用了线程的suspend()将线程挂起。(容易死锁,不推荐)

    线程从运行进入阻塞状态之后,接着只能继续阻塞或者再次进入就绪状态,下面情况会使线程由阻塞状态重新进入就绪状态,

    • 线程调用的slee()经过了指定时间
    • 线程调用的阻塞IO方法返回
    • 线程成功获取同步监视器
    • 线程收到其他线程发出的通知
    • 被挂起(suspend)的线程又被程序调用了resume方法

    下图演示了线程状态转换过程,

    注意从上图可知,

    线程从阻塞状态只能进入就绪状态,

    通常情况下,就绪状态和运行状态的转换是不受程序控制的,而是由JVM线程调度机制控制的

    yield()方法可以让运行状态的线程进入就绪状态

    线程死亡

    线程结束后就处于死亡状态,线程会以如下三种方式结束,

    • run()或call()正常执行完成,线程正常结束
    • 线程抛出一个未捕获的Exception或Error
    • 直接调用线程的stop()方法结束线程,容易死锁

    注意,子线程一旦启动,其地位和主线程是一样的,所以一旦主线程结束了,子线程不会受影响,不会跟着结束

    线程对象的isAlive()方法在就绪,运行,阻塞时返回true,在新建,死亡时返回false

    对已经死亡的线程调用start()是无效的,会抛出异常。 死亡的线程不可再次作为线程来执行。

    对于新建的线程,调用两次start()方法也会抛出异常

  • 相关阅读:
    基金进阶
    gpgj-19.高级课总结
    (10)大类资产配置一升级版股债平衡
    13.高速公路行业
    16.投资法总结以及类集团公司介绍
    08.零售类公司分析•上
    在Ubuntu 12.04系统中安装配置OpenCV 2.4.3的方法
    一台电脑上含有多个ubuntu系统的卸载方法
    Linux命令每日一个
    Java UDP实现聊天功能代码
  • 原文地址:https://www.cnblogs.com/CreatorKou/p/9830013.html
Copyright © 2011-2022 走看看