Java并发编程 03 Java 线程状态图

来源:互联网 发布:linux sleep 1s 编辑:程序博客网 时间:2024/06/05 20:17

线程状态转换图如下:
这里写图片描述

线程状态图

初始态——>就绪态: 当线程对象调用start()方法时就会进入就绪态,若就绪队列没有线程,则直接进入运行态。

就绪态——>运行态: 由系统调用完成。

就绪态<——运行态: 调用Thread.yield()函数,由系统调用完成(当线程时间片用完)

运行态——>阻塞态: 当线程请求锁失败时进入阻塞态。

阻塞态——>就绪态: 阻塞队列中的线程会不断检查锁是否可用,一旦可用就进入就绪队列。

运行态——>等待态

调用Object.wait()方法 wait方法必须在同步块内部;必须由同步块的锁对象调用;必须由notify方法和wait方法必须由同一个锁对象调用调用Thread.join()方法调用LockSupport.park()方法

等待态——>就绪态:某一个线程调用了 锁对象.notify()方法,并且等待的线程并不需要锁

等待态——>阻塞态:锁对象.notify()方法,并且等待的线程需要锁同步。

注意点

wait()方法会释放CPU执行权 和 占有的锁。sleep(long)方法仅释放CPU使用权,锁仍然占用;线程被放入超时等待队列,与yield相比,它会使线程较长时间得不到运行。yield()方法仅释放CPU执行权,锁仍然占用,线程会被放入就绪队列,会在短时间内再次执行。wait和notify必须配套使用,即必须使用同一把锁调用;wait和notify必须放在一个同步块中调用wait和notify的对象必须是他们所处同步块的锁对象。
原创粉丝点击