• java 线程


    线程有自己的状态,除了新建和死亡状态,还有 等待/阻塞 、准备 、和运行 状态。 线程状态的转换是:准备可以进入运行,运行也可以进入准备;运行还可以进入等待/阻塞;但是等待/阻塞不能进入运行,等待/阻塞可以进入准备状态。

    • 新建 :就是利用Thread的构造函数定义一个线程,从此,线程的生命开始了。
    • 准备 :当执行了Thread中的strat方法,及使得线程进入准备状态,随时可以进入运行状态。
    • 运行 :当操作系统的调度器把CPU分给了这个线程,这个线程就进入了运行状态,也就是执行我们在线程中定义的run方法里面的内容。
    • 等待/阻塞 :
         当一个线程的继续执行需要一个条件,但是该条件还不成熟,需要调度器来通知。而等待调度器发出通知的这段时间内,线程就进入了等待状态。
         当一个线程访问一个资源的时候,这个资源正被另外的线程访问,而这个资源是加了锁的,之允许一个线程访问。这时候,线程就进入了阻塞状态。
    • 死亡:当线程的run方法运行完之后,线程死亡,这是正常死亡;当线程方发生异常而没有捕获时,也会死亡,这是非正常死亡。不管是正常死亡还是非正常死亡,都是死亡

    详细状态转换图:

        1、线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但不管怎样,当我们new了这个对象后,线程就进入了初始状态;

      2、当该对象调用了start()方法,就进入可运行状态;

      3、进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态;

      4、进入运行状态后情况就比较复杂了

      4.1、run()方法或main()方法结束后,线程就进入终止状态;

      4.2、当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片;

      4.3、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;

      4.4、当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchronized(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配CPU时间片;

      4.5、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记(线程被唤醒后之所以进入锁池,是因为调用ob.wait()和ob.notify()/ob.notifyAll()方法必须先获得ob的锁,也就是这3个方法必须在synchronized(ob){}方法体内调用,否则报运行时错误java.lang.IllegalMonitorStateException,尽管编译通过。所以唤醒后会进入锁池等待ob的锁)。

    更多内容查看:http://lavasoft.blog.51cto.com/62575/27069 

  • 相关阅读:
    【convertio.co】免费在线文档转化神器
    成长需熬过“四苦”
    岁月饶过谁
    致我的未来
    一定要相信自己
    奋斗的意义是什么?
    一生一世一双人,半醉半醒半浮生
    逆境中的自己
    怎样才能让人看到你呢
    2020 遇见更好的自己
  • 原文地址:https://www.cnblogs.com/children/p/2387724.html
Copyright © 2020-2023  润新知