- 新建(New):线程对象已经产生但是未启动,
如通过new产生一个线程对象,但是未调用start()之前
- 就绪(Runnable):每个多线程系统都有排程器,排程器会从线程池中选择一个线程并启动他,当一个线程处于可执行状态时,表示它可能正处于线程池中等待排程器启动他。
如执行了start()方法以后,线程就处于可执行状态了。
- 运行(running):已经获取到CPU资源,正在执行run方法
当前线程的时间片如果被cpu抢占的话就变成就绪状态
- 死亡(dead):当一个线程正常结束,便处于死亡状态,
如一个线程的run()函数执行完毕以后这个线程就进入死亡状态
- 阻塞(blocked):当一个线程处于阻塞状态时,系统排程器就会忽略他,不对他进行排程。当处于阻塞状态的线程重新回到可执行状态时,它才可能重新执行。
如通过对一个线程调用wait()函数后,线程就进入阻塞状态,只有再次调用notify或notifyAll后才能回到可执行状态
阻塞本身分为几种
- 等待阻塞:线程执行了wait,JVM会把当前线程放入等待队列
- 同步阻塞:线程在获取对象锁的时候,如果该同步锁被其他线程占用,则JVM会把当前线程放入锁池中
- 其他阻塞:运行的线程执行sleep(),join()或者发出IO请求时,JVM会把当前线程设置为阻塞状态,当sleep()执行完,join()线程终止,IO处理完毕线程再次恢复
Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别