一、线程的状态

Thread源码中有个枚举State,总共定义了线程的六种状态:

public enum State {              NEW,  //新建状态,线程对象已经创建,但尚未启动        RUNNABLE, //就绪状态,可运行状态,调用了线程的start方法,已经在java虚拟机中执行,等待获取操作系统资源如CPU,操作系统调度运行。        BLOCKED, //堵塞状态。线程等待锁的状态,等待获取锁进入同步块/方法或调用wait后重新进入需要竞争锁        WAITING, //等待状态。等待另一个线程以执行特定的操作。调用以下方法进入等待状态。 Object.wait(), Thread.join(),LockSupport.park        TIMED_WAITING, //线程等待一段时间。调用带参数的Thread.sleep, objct.wait,Thread.join,LockSupport.parkNanos,LockSupport.parkUntil        TERMINATED; //结束状态。    }

堵塞状态(Blocked):
实例:小亮要骑车去上班,结果发现自行车被锁住了,现在小亮无法去上班了,就是处于堵塞状态了。

进入堵塞状态的方法:

  1. 当一个线程要进入synchronized语句块/方法时,如果没有获取到锁,会变成BLOCKED
  2. 在调用Object.wait()后,被notify()唤醒,再次进入synchronized语句块/方法时,如果没有获取到锁,会变成BLOCKED

不限期等待状态(waiting):
实例:小亮喜欢小红,知道她也去上班,就在楼下等着她一起去上班(小红不下来,他就不走)

进入不限期等待状态的方法:

  1. 没有设置timeout参数的Object.wait()
  2. 没有设置timeout参数的Thread.join()
  3. LockSupport.park()

限期等待状态(timed_waiting):
实例:小亮知道小红也去上班,就打算等她半小时,结果她还没有下来,于是小亮决定不等她了,直接去公司了。

进入限期等待的方法:

  1. Thread.sleep()方法
  2. 设置了timeout参数的Object.wait()方法
  3. 设置了timeout参数的Thread.join()方法
  4. LockSupport.parkNanos()方法
  5. LockSupport.parkUntil()方法

二、线程常用方法

线程整个生命周期有五种状态:新建、就绪、运行、堵塞、死亡。

线程的常用方法及状态的变化:




java 获取activity线程 java获取线程状态_常用方法


1、新建状态=》就绪状态:线程调用start()方法之后进入就绪状态
2、就绪状态=》运行状态:操作系统给线程分配的时间片之后进入运行状态
3、运行状态=》就绪状态:线程执行完时间片后进入就绪状态
4、运行状态=》堵塞状态:调用阻塞方法进入阻塞状态
5、阻塞状态=》就绪状态:解除阻塞之后进入就绪状态
6、运行状态=》死亡状态:run方法结束或者中断请求,线程进入死亡状态

线程常用方法:

  • start() : 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
  • run() : 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回
  • stop() : 中断线程,过期不推荐使用
  • sleep() : 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
  • wait() : 无参数是永久等待,有参数是在指定的毫秒数内让当前正在执行的线程等待被唤醒
  • notify()/notifyAll() : 唤醒等待中的线程
  • join() :等待执行了join的线程先完成
  • interrupt() : 中断线程
  • yield() : 让出当前线程的CPU时间

yield()方法,是让当前线程让出CPU时间进入就绪状态,但是下个时间片,该线程依然有可能被再次选中运行。