Java多线程状态

Java多线程状态

①线程状态转换

  1. 新建状态:新建一个线程对象,也就是new一个线程对象
  2. 就绪状态:线程对象在创建完后,等待其他线程调用对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待CPU的使用权。
  3. 运行状态:就绪状态的线程获取了CPU的使用权后,执行该线程run()里的代码。
  4. 阻塞状态:该状态是线程因为某种原因失去了CPU使用权,暂时的停止了运行,直到该原因结束后,又会回到就绪状态,等待获取CPU的使用权。
  5. 死亡状态:线程执行完或者因为异常终止执行run()方法,该线程就结束其生命周期。

阻塞线程的情况:

  1. 等待阻塞:运行线程时执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁)
  2. 同步阻塞:运行的线程在获取对象的同步锁的时候,如果同步锁被其他的线程占用,JVM会把该线程放入锁池中。
  3. 其他阻塞:运行的线程执行sleep()或join()方法,或者发出I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕,线程重新转入就绪状态。(sleep和wait不一样,sleep不会释放持有的锁!!!)

②线程调度

  1. 调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会,CPU的使用权也会比较多。
  2. 线程睡眠:Thread.sleep(long millis)方法,线程转到阻塞状态。millis参数设定睡眠的时间,单位为毫秒。睡眠结束后,转为就绪状态。(sleep平台转移移植性好)。
  3. 线程等待:Object类中的wait()方法导致当前的线程等待,直到其他线程调用此对象的notify()方法或者notifyAll()方法。(wait(),notify()和notifyAll()方法都是object方法!!,后两个等价于wait(0))
  4. 线程让步:Thread,yield()方法,暂停当前正在执行的线程,把执行机会让给相同及以上的优先级的线程。
  5. 线程加入:join()方法,等待其他线程终止。如果当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个线程运行结束,当前线程就从阻塞状态变为就绪状态。
  6. 线程唤醒:Object类的notify()方法,唤醒对象监视器上等待的单个线程。如果所有线程都在此对象上等待,就会选择唤醒其中一个线程。选择是随机的!!线程通过调用其中一个wait方法,在对象的监视器上等待。直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。

Thread类三个线程优先级静态常量

  • static int MAX_PRIORITY;(线程可以具有的最高优先级,10)
  • static int MIN_PRIORITY;(线程可以具有的最低优先级,1)
  • static int NORM_PRIORITY;(默认优先级,5)

线程优先级的设置可以用Thread类的setPriority(),获取线程优先级可以使用getPriority()方法。

每一个线程都由默认的优先级。主线程的默认优先级是5。

线程的优先级有继承关系。

即使JVM提供了10个线程优先级,也是不确定的,这取决于操作系统,一般操作系统都不能很好的映射。如果希望一直到各个操作系统中,应该仅仅使用上面的三个静态常量为优先级,这样就能保证优先级采用了同样的调度方式!!

posted @ 2022-02-16 18:20  霜鱼CC  阅读(39)  评论(0)    收藏  举报