加瓦面试题自总结-线程篇

80 阅读2分钟

1. 说一下线程的生命周期(线程状态)

  1. NEW(新建状态):线程刚被新建出来未启动的状态。
  2. RUNNABLE(可运行状态):线程在java虚拟机中可运行的状态,他可能正在执行自己的代码,也可能不在,这取决于操作系统的处理器。
  3. BLOCKED(阻塞状态):当一个线程尝试获取一个对象锁,而该对象锁又被其他线程所持有时,线程进入阻塞状态,当该线程获取对象锁时则重新进入可运行状态。
  4. WAITING(等待状态又称无限等待状态):当一个线程在等待其他线程执行唤醒动作时处于等待状态,该状态不能自然醒来,只能通过其他线程调用notify()或notifyAll()方法才能够唤醒。
  5. TIMED WAITING(计时等待状态):同waiting状态,有几个方法有超时参数,调用他们进入timed waiting状态。这一状态一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread类中的sleep()方法和Object类中的wait()方法。
  6. TERMINATED(被终止状态):run方法正常退出而死亡或者代码中出现了未捕获的异常终止了run方法而死亡。

2.sleep和wait的区别是什么?

sleep是Thread中的方法,wait是Object中的方法。sleep方法导致线程暂停指定的时间,让出cpu给其他线程,但它的监控状态依然保持着,当指定的时间到了又会恢复至运行状态。

wait方法是把控制权交出去,然后进入等待此对象的等待锁定池,处于等待状态,只有针对此对象调用notify或者notifyAll方法本线程才会进入对象锁定池,准备获取对象锁进入运行状态。

还有就是,调用sleep方法时线程不会释放对象锁,而调用wait方法时线程会放弃对象锁。

3.是否了解线程的调度机制?

线程调度是指操作系统根据一定的策略和算法,决定何时将 CPU 分配给各个线程,以实现多任务处理。调度机制有抢占式调度和协作式调度两种,java中的线程调度是抢占式的,即操作系统可以强制当前运行的线程让出 CPU,将 CPU 分配给其他线程,cpu资源的分配完全由操作系统控制。协同式调度中的每个任务在执行过程中会显式地放弃控制权,允许其他任务运行,cpu资源的分配由任务本身分配。