线程状态转换图
New:新建状态,创建线程对象,并没有启动
start():分配线程空间,启动线程
Runnable:就绪状态,万事具备,只欠CPU
Scheduler:调度,分配CPU
Running:运行状态
run() completes:run方法执行完
Dead:死亡状态
sleep():睡觉,与wait()的区别是,sleep不会释放锁,一般不要把sleep()放到synchronized()代码块中
Blocked:阻塞状态
sleep() timeout:睡眠完毕
interupt():打断
阻塞状态解除后进入就绪状态
Blocked in object's wait pool:在共享对象的等待池上等待
wait()必须写在synchronized()代码块里,执行到wait()说明当前线程已经拿到锁了,在wait()的内部,会先释放锁(别的线程就有机会拿到锁使用),然后进入阻塞状态,之后,当它被另一个线程notify()唤醒后会重新获取锁,拿到锁后进入就绪状态。 其次,wait调用完成后,执行后面的业务逻辑代码,(通过notify唤醒其它线程),然后退出synchronized同步块,再次释放锁。
notify():唤醒
synchronized():同步锁,调用时试图拿对象上的锁,拿到后进入代码块中执行,没拿到则等待锁的拿到,在锁池上等待
Blocked in object's lock pool:在锁池上等待
Lock available:拿到锁了
拿到锁后重新进入就绪状态