Thread相关API

参考书籍:《java多线程核心编程技术》

Thread相关API,这些API可以改变线程对象的状态

          

  • 新建一个线程对象,调用start方法后,系统会为该线程分配CPU资源,此时该线程处于可运行状态(Runnable),这是一个准备运行的状态。如果线程能够抢占到CPU资源,就会处于运行状态(Running)
  • Runnable和Running状态可以相互转换,因为可能一个线程执行一段时间后,有其他线程抢占了CPU资源,这时该线程就从Running切换到Runnable状态
  • 线程执行过程中遇到一个阻塞式IO操作,在该IO操作执行结束前,该线程处于阻塞状态
  • run方法运行结束后进入销毁阶段,整个线程执行完毕

线程进入Runnable状态的情况:

  • 调用sleep方法后经过指定休眠时间
  • 线程调用的阻塞IO已经返回,阻塞方法执行结束
  • 执行挂起suspend方法的线程,又调用了resume方法
  • 调用了wait方法的线程对象在等待唤醒,另一个线程发出了唤醒(同一个同步锁)
  • 线程对象调用了start方法,且获得了同步监视器

线程出现阻塞Blocked的情况:

  • 调用sleep方法还没有达到指定的休眠时间
  • 调用suspend挂起方法(容易发生死锁)
  • 调用阻塞式IO方法,且还没有返回结果
  • 调用了wait方法,且没有收到notify唤醒
  • 线程试图获取同步监视器,但是该同步监视器被另一个线程持有

每个锁对象都有两个队列,就绪队列和阻塞队列。就绪队列存储了获得锁的线程,阻塞队列存储了被阻塞的线程。

一个线程被唤醒后才会进入就绪队列等待cpu调度;反之,一个线程被wait后,就会进入阻塞队列,等待下一次唤醒

猜你喜欢

转载自www.cnblogs.com/qf123/p/9667415.html