Java多线程——线程的状态

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;
}

初始态:NEW

  • 线程创建且没有执行start方法时的状态

可运行状态:RUNNABLE

  • 该状态下的线程已经获得执行所需的所有资源,只要CPU分配执行权就能运行。

阻塞态:BLOCKED

  • 当一条正在执行的线程请求某一资源失败时,就会进入阻塞态。
  • 请求锁失败时进入的状态。
  • 由一个阻塞队列存放所有阻塞态的线程。
  • 处于阻塞态的线程会不断请求资源,一旦请求成功,就会进入就绪队列,等待执行。

等待态:WAITING

  • 当前线程中调用wait、join、park,当前线程就会进入等待态。
  • 也有一个等待队列存放所有等待态的线程。
  • 线程处于等待态表示它需要等待其他线程的指示才能继续运行。
  • 进入等待态的线程会释放CPU执行权,并释放资源(如:锁)

计时等待态:TIMED_WAITING

  • 当调用sleep、wait、join、LockSupport.parkNanos或者LockSupport.partUntil,进入该状态
  • 它和等待态一样,并不是因为请求不到资源,而是主动进入,并且进入后需要其他线程唤醒
  • 进入该状态后释放CPU执行权 和 占有的资源
  • 与等待态的区别:到了超时时间后自动进入阻塞队列,开始竞争锁

终止态:TERMINATED

  • 线程中断或者运行结束的状态


几个区别

Sleep和wait的区别

  • sleep()该方法是属于 Thread 类中的,而 wait()方法则是属于 Object 类中的。
  • sleep()方法导致了程序暂停执行指定的时间,让出 cpu 给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态,但是不会释放对象锁.
  • wait()方法线程会放弃对象锁,进入等待此对象的等待队列,只有针对此对象调用 notify()方法后,等待的线程才进入对象锁定池准备获取对象锁进入运行状态。

start与run区别

  • start()方法来启动线程,真正实现了多线程运行。这时无需等待 run 方法体代码执行完毕, 可以直接继续执行下面的代码。
  • 通过调用 Thread 类的 start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。
  • 方法 run()称为线程体,它包含了要执行的这个线程的内容,线程就进入了运行状态,开始运行 run 函数当中的代码。 Run 方法运行结束, 此线程终止。然后 CPU 再调度其它线程。

转载于:https://my.oschina.net/u/4120078/blog/3043775

你可能感兴趣的:(java)