面试题答案
一键面试在Java线程池中,可通过以下方法使线程池进入终止状态:
- shutdown():
- 具体行为:
- 调用该方法后,线程池不再接受新任务,但会继续执行已提交到队列中的任务,直到所有任务执行完毕。
- 线程池状态变为
SHUTDOWN
。
- 适用场景:
- 适用于允许线程池在停止接受新任务后,将现有任务正常执行完的场景。例如,在一个定时任务系统中,在系统关闭前调用
shutdown()
,可以确保已提交的定时任务能顺利完成,而不会有新任务被提交进来干扰现有任务执行。
- 适用于允许线程池在停止接受新任务后,将现有任务正常执行完的场景。例如,在一个定时任务系统中,在系统关闭前调用
- 具体行为:
- shutdownNow():
- 具体行为:
- 调用该方法后,线程池会尝试停止所有正在执行的任务,停止处理等待队列中的任务,并返回等待执行的任务列表。
- 线程池状态变为
STOP
。 - 对于正在执行的任务,线程会尝试通过调用
Thread.interrupt()
来中断线程,但这并不保证任务一定会被中断,因为任务代码可能没有正确处理中断信号。
- 适用场景:
- 适用于需要立即停止线程池,不再执行队列中任务的场景。比如在一个紧急情况下,如系统资源严重不足,需要立即释放线程池资源,就可以调用
shutdownNow()
尝试尽快停止所有任务。
- 适用于需要立即停止线程池,不再执行队列中任务的场景。比如在一个紧急情况下,如系统资源严重不足,需要立即释放线程池资源,就可以调用
- 具体行为:
- awaitTermination(long timeout, TimeUnit unit):
- 具体行为:
- 该方法用于阻塞当前线程,直到线程池进入终止状态,或者达到指定的等待时间。
- 它需要与
shutdown()
或shutdownNow()
配合使用。 - 如果在等待时间内线程池成功终止(所有任务执行完毕或被强行停止),则返回
true
;如果等待超时,线程池还未终止,则返回false
。
- 适用场景:
- 适用于需要等待线程池终止,且有时间限制的场景。例如,在应用程序关闭时,调用
shutdown()
后,调用awaitTermination()
并设置一个合理的等待时间,确保在这个时间内线程池能正常关闭,若超时还未关闭,则可采取其他措施,如强制关闭相关资源。
- 适用于需要等待线程池终止,且有时间限制的场景。例如,在应用程序关闭时,调用
- 具体行为: