• java 多线程 2 : 线程的生命周期


    线程得生命周期:

      当线程被创建并且启动之后,并不是一启动就进入执行状态,也不是一直处于执行状态,在线程得生命周期中,他要经过创建(New),就绪(Runnable),运行(Running),阻塞(Blocked),和死亡(Dead)。线程启动以后,不能一直霸占CPU独自运行,CPU需  要在多条线程之间切换,线程状态也会多次在运行,阻塞之间切换。

    新建状态:new关键字创建一个线程后,该线程就处于新建状态,此时它和其他的java对象一样,仅仅由java虚拟机为其分配内存,并初始化其成员变量,此时线程对象没有表现任何线程的动态特征,程序也不会执行线程的执行体。

    就绪状态:当线程调用了start()方法之后,该线程处于就绪状态,表示该线程可以运行了,但是并没有开始运行,何时运行取决于jvm里线程调度器的调度。

    public class Thread4 extends Thread{
        
        public void run() {
            for(int i = 0 ; i < 30 ; i++) {
                System.out.println(Thread.currentThread().getName() + "--" + i);
            }
        }
        public static void main(String[] args) {
            new Thread4().run();
            new Thread4().run();
        }
    }

    注意:  启动线程是调用对象的start()方法 , 而不是直接调用run()方法,否则就变成单线程了
         只能对处于新建状态的线程调用start()方法,否则将引起IllegalThreadStateException异常

    运行状态:  处于就绪状态的线程获得了CPU开始执行run()方法的线程执行体,该线程就处于运行状态。
           线程不可能一直在运行状态(除非线程执行体足够短,瞬间执行完成),线程运行过程中需要被中断目的是使其他线程获得执行的机会。线程调度,取决于底层平台所采取的策略。

    阻塞状态:

      当发生如下情况时,线程进入阻塞状态:
          线程调用sleep()方法,主动放弃所占用的处理器资源
          线程调用了一个阻塞式的IO方法,在该方法返回前,该线程被阻塞
          线程试图获得一个同步监视器,但是该监视器正在被其他线程所持有
          线程在等待某个通知(notify)
          程序调用了线程suspend()方法将该线程挂起,但是,这个方法容易造成死锁,应当尽量避免使用该方法

      被阻塞线程的阻塞解除后,必须重新等待线程调度器再次调度它
      针对上面几种情况,当发生如下特定的情况时可以解除上面的阻塞,让该线程重新进入就绪状态
          调用sleep()方法的线程过了指定时间
          线程调用的阻塞式IO方法已经返回
          线程成功的获得了试图取得的同步监视器
          线程正在等待某个通知时,其他线程发出了一个通知
          处于挂起状态的线程调用了resume恢复方法

      yield可以让运行状态的线程,转入就绪状态

    线程死亡:线程会以如下三种方式结束, 结束后就处于死亡状态。
         run()或者call()方法执行完成,线程正常结束
         线程抛出一个没有被捕获的Exception或者Error
         直接调用线程的stop()方法来结束该线程 --该方法容易导致死锁,通常不推荐使用。
      
         当主线程结束,其他线程不会受到任何影响。一旦子线程启动起来之后,它拥有和主线程同样的地位,不会受到主线程的影响。

    isAlive()方法:  就绪,运行,阻塞  返回true;  新建 , 死亡 , 返回false;

    温故而知新
  • 相关阅读:
    linux下,ssh服务安装和法git简单的使用方,整理实测。
    css+jquery实现标签浮动效果《前端随笔》
    java 学习随笔《时间篇》
    企业使用OKR管理绩效的三大好处
    绩效反馈评语:如何评估团队合作
    高绩效团队:使用 OKR 方法持续改进
    企业成功实践OKR的三个秘诀
    jsGen技术总结之:在Node.js中构建redis同步缓存
    财务数据可视化
    python3爬取上市公司基本数据
  • 原文地址:https://www.cnblogs.com/Uzai/p/9667223.html
Copyright © 2020-2023  润新知