线程状态流转
2018-07-24 15:35:22 0 举报
Java线程状态流转
作者其他创作
大纲/内容
新建状态(New)
lock.wait()LockSupport.park()
运行状态(Running)
t1.sleep结束t2执行结束/超时IO完成
死亡状态(Dead)
锁池(Lock Pool)
Q & A:1. 状态说明: a)新建状态:通过new Thread新建一个线程实例 b)就绪状态:线程实例被创建后,调用start()方法进入就绪状态,等待OS调度获取CPU时间片(timeslice) c)运行状态:线程争夺到CPU时间片,开始执行run()里的代码 d)阻塞状态:当线程因为某种原因放弃CPU使用权,暂停执行进入阻塞状态,直到到达某种条件后进入就绪状态,才能再去争夺CPU时间片然后重新进入运行状态,阻塞的情况可以分为以下三种: i. 等待阻塞:运行状态下调用lock.wait(),放弃锁资源进入【锁等待队列】,需要被其他线程唤醒notify()/notifyAll之后进入【锁池】获取争夺锁的权力 ii. 同步阻塞:争夺同步锁的线程在同步锁被其他线程占用的情况下会被阻塞放入【锁池】,如到达synchronized临界区争夺锁时、或者wait()的线程被唤醒后争夺锁时。【锁池】中的线程争夺到锁之后会进入就绪状态等待OS调度获取CPU时间片。 iii. 其他阻塞:当线程执行sleep(long)、执行其他线程的join()或者遇到I/O阻塞时,线程会进入【阻塞状态】,直到sleep时间到、join的线程结束或timeout、或者I/O执行完成时,线程才会进入就绪状态等待调度。 e)死亡状态:run()执行结束或异常退出时,线程的整个生命周期完结。2. 中断机制interrupt:线程在调用interrupt()方法之后,并不会真正的中断线程,而是仅仅将线程的中断标志符设置为true,至于之后的操作是终止、继续还是开始新的操作就要看程序本身的处理了。根据中断时线程的状态可以分为以下三种情况: a)正在运行时被执行interrupt(),线程的运行不会收到影响,可以在代码中通过Thread.currentThread().isInterrupted()获得中断标志符决定如何处理中断。 b)线程处于可中断的阻塞状态下(sleep、join、wait、await或可中断IO等)被执行interrupt(),会抛出InterruptException异常并重置中断标志符(false),上层代码可以捕获这个异常并决定如何处理。**在sleep/join/wait等方法下,线程在阻塞的同时也在循环检查中断标志符状态,一旦发现为true了就会抛出异常并重置。 c)不可中断的阻塞状态下被执行interrupt()不会受到影响,如synchronized/Lock.lock()争夺同步锁时。中断相关的几个方法:interrupt():【写操作】更改中断标志符--trueisInterrupted():【读操作】读取中断标志符状态interrupted():【读写操作】读取中断标志符状态并重置状态--false
t1.sleep()t2.join()IO阻塞
start()
阻塞状态(Blocking)
yield()
线程状态流转图
执行结束
lock.notify()/notifyAll()LockSupport.unpark()
获取到锁
就绪状态(Runnable)
synchronized(lock)
争夺到时间片
等待队列(Wait Set)
0 条评论
下一页
为你推荐
查看更多