多线程(二)生命周期

多线程(二)生命周期

  1. 线程状态


  1. 新建状态(new):

    使用new创建一个线程对象,仅仅在堆中分配内存空间,在调用start方法之前.新建状态下,线程压根就没有启动,仅仅只是存在一个线程对象而已.

    Thread t = new Thread();//此时t就属于新建状态当新建状态下的线程对象调用了start方法,此时从新建状态进入可运行状态.线程对象的start方法只能调用一次,否则报错:IllegalThreadStateException。

  2. 可运行状态:

    • 就绪:线程对象t调用了start()方法后,进入就绪状态,等待获取cpu,随时可以被CPU调度执行;

      • 运行:线程对象t获取CPU调度并执行,线程只能从就绪状态到运行状态;
  3. 阻塞:有人又把阻塞状态,等待状态,计时等待状态合称为阻塞状态

  4. 阻塞状态:正在运行的线程因为某些原因放弃CPU,暂时停止运行,就会进入阻塞状态,此时JVM不会给线程分配CPU,直到线程重新进入就绪状态,才有机会转到运行状态.阻塞状态只能先进入就绪状态,不能直接进入运行状态.

    • 等待阻塞:线程对象t调用线程的wait()方法放弃锁,等待其他线程完成,前提是t必须持有锁

    • 同步阻塞:线程对象t在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。

    • 其他阻塞:通过调用线程对象t的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态;

  5. 等待状态(waiting)(等待状态只能被其他线程唤醒):此时使用的无参数的wait方法,

    • 当线程处于运行过程时,调用了wait()方法,此时JVM把当前线程存在对象等待池中.
  6. 计时等待状态(timed waiting)(使用了带参数的wait方法或者sleep方法)

    • 当线程处于运行过程时,调用了wait(long time)方法,此时JVM把当前线程存在对象等待池中.

    • 当前线程执行了sleep(long time)方法.

  7. 终止状态:通常称为死亡状态,表示线程终止;

    • 正常执行完玩run()方法后退出
    • 遇到异常而退出(遇到异常后,程序就会中断)

    • 线程一旦终止就不可以重新启动,否则会报错(IllegalThreadStateException).

    • 在Thread类中过时的方法(因为存在线程安全问题,所以弃用了):
      void suspend() :暂停当前线程
      void resume() :恢复当前线程
      void stop() :结束当前线程


  • 三种线程状态图:

1


2


3

猜你喜欢

转载自blog.csdn.net/qq_25385555/article/details/78980778
今日推荐