zoukankan      html  css  js  c++  java
  • java线程的五种状态

    五种状态

    开始状态(new)
    就绪状态(runnable)
    运行状态(running)
    阻塞状态(blocked)
    结束状态(dead)

    状态变化

    1、线程刚创建时,是new状态
    2、线程调用了start()方法后,进入runnable状态,此时并未真正执行,需要和其他线程竞争cpu资源
    3、当该线程竞争到了cpu资源,进入running状态
    4、线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态之间处于blocked状态
    (1)等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中,
    进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,
    (2)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
    (3)其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。
    当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
    5、当线程正常执行结束会进入dead状态(一个未捕获的异常也会使线程终止)

    注:

    yield()只是使当前线程重新回到runnable状态
    sleep()会让出cpu,不会释放锁
    join()会让出cpu,释放锁
    wait() 和 notify() 方法与suspend()和 resume()的区别在于wait会释放锁,suspend不会释放锁
    wait() 和 notify()只能运行在Synchronized代码块中,因为wait()需要释放锁,如果不在同步代码块中,就无锁可以释放
    当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),
    进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒

  • 相关阅读:
    福大软工1816 · 第二次作业
    团队第一次作业
    软工实践 第三次作业 结对作业一
    软件工程-个人项目
    白茫茫一片真干净·福大软工1816 · 第一次作业
    Alpha 冲刺 (3/10)
    Alpha冲刺 (2/10)
    Alpha 冲刺(1)
    福大软工 · 第七次作业——需求分析报告
    福大软工 · 第八次作业(课堂实战)- 项目UML设计(团队)
  • 原文地址:https://www.cnblogs.com/jis121/p/11039726.html
Copyright © 2011-2022 走看看