前两天面试,面试官问我:小伙子,你知道线程有几种状态吗?
呵,这也太简单了吧~ 我自信答道: 五种状态,分别是创建、就绪、运行、阻塞、死亡
面试官笑笑:那你知道调用sleep()之后是什么状态吗?
Emm… 阻塞态?但是sleep()的线程是不会释放锁的呀,就绪态?可人家也不能运行呀…
面试官看着我抓耳挠腮的样子,冷笑道:回去再好好看吧…
其实,Java线程除了以上五种状态,还存在等待(WAITING) 和 超时等待(TIMED_WAITING) 两种状态
等待(WAITING)
处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。对应的方法有以下几种
- Object.wait()
- Thread.join()
- LockSupport.park()
如果要进行唤醒,则对应以下几种方法
- Object.notify()
- Object.notifyAll()
- LockSupport.unpark(Thread)
超时等待(TIMED_WAITING)
处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒,对应方法有以下几种
- Thread.sleep(long)
- Object.wait(long)
- Thread.join(long)
- LockSupport.parkNanos()
- LockSupport.parkUntil()
阻塞状态(BLOCKED)
线程等待进入被synchronized关键字修饰的方法或代码块
就绪状态(RUNNABLE)
- 线程调用start()方法
- 当前线程sleep()结束,其他线程join()结束,wait()被唤醒
- 调用yield()方法,释放时间片,回到就绪态
- 当前线程取得对象锁