当线程被创建以后,它既不是已启动就进入执行状态,也不是一直处于执行状态。

java中定义线程一共有 6 种状态,新建(NEW)、运行状态(RUNNABLE,这里面包含了就绪状态) 、阻塞(BLOCKED)、等待(WAITING)、超时等待状态(TIMED_WAITING) 、终止(TERMINATED)

public static enum State {
        NEW,
        RUNNABLE,
        BLOCKED,
        WAITING,
        TIMED_WAITING,
        TERMINATED;
    }
  • NEW:初始状态,线程被构建,但是还没有调用 start 方法
  • RUNNABLED:运行状态,JAVA 线程把操作系统中的就绪
    和运行两种状态统一称为“运行中”
  • BLOCKED:阻塞状态,表示线程进入等待状态,也就是线程
    因为某种原因放弃了 CPU 使用权,阻塞也分为几种情况
    ➢ 等待阻塞:运行的线程执行 wait 方法,jvm 会把当前
    线程放入到等待队列(这就是waiting状态)
    ➢ 同步阻塞:运行的线程在获取对象的同步锁时,若该同
    步锁被其他线程锁占用了,那么 jvm 会把当前的线程
    放入到锁池中
    ➢ 其他阻塞:运行的线程执行 Thread.sleep 或者 t.join 方
    法,或者发出了 I/O 请求时,JVM 会把当前线程设置
    为阻塞状态,当 sleep 结束、join 线程终止、io 处理完
    毕则线程恢复
  • WAITING 无限期等待另一个线程执行特定操作。这个状态下是指线程拥有了某个锁之后, 调用了他的wait方法, 等待其他线程/锁拥有者调用 notify / notifyAll 一遍该线程可以继续下一步操作, 这里要区分 BLOCKED 和 WATING 的区别, 一个是在临界点外面等待进入, 一个是在临界点里面wait等待别人notify, 线程调用了join方法 join了另外的线程的时候, 也会进入WAITING状态, 等待被他join的线程执行结束
  • TIME_WAITING:超时等待状态,超时以后自动返回
  • TERMINATED:终止状态,表示当前线程执行完毕

java 线程等待和等待超时 java线程阻塞跟等待的区别_多线程

等待队列

调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) 代码段内。
与等待队列相关的步骤和图

线程1获取对象A的锁,正在使用对象A。
线程1调用对象A的wait()方法。
线程1释放对象A的锁,并马上进入等待队列。
锁池里面的对象争抢对象A的锁。
线程5获得对象A的锁,进入synchronized块,使用对象A。
线程5调用对象A的notifyAll()方法,唤醒所有线程,所有线程进入同步队列。若线程5调用对象A的notify()方法,则唤醒一个线程,不知道会唤醒谁,被唤醒的那个线程进入同步队列。
notifyAll()方法所在synchronized结束,线程5释放对象A的锁。
同步队列的线程争抢对象锁,但线程1什么时候能抢到就不知道了。

同步队列状态

当前线程想调用对象A的同步方法时,发现对象A的锁被别的线程占有,此时当前线程进入同步队列。简言之,同步队列里面放的都是想争夺对象锁的线程。
当一个线程1被另外一个线程2唤醒时,1线程进入同步队列,去争夺对象锁。
同步队列是在同步的环境下才有的概念,一个对象对应一个同步队列。
线程等待时间到了或被notify/notifyAll唤醒后,会进入同步队列竞争锁,如果获得锁,进入RUNNABLE状态,否则进入BLOCKED状态等待获取锁。