面试题答案
一键面试AbortPolicy
- 新任务处理:当线程池饱和时,新提交的任务会被拒绝,并抛出
RejectedExecutionException
。这意味着新任务不会被执行,也不会被线程池的已有线程重复利用。 - 已有线程状态变化:已有线程继续执行它们当前的任务,不受新任务被拒绝的影响。线程池的运行状态也不会因为新任务被拒绝而改变,直到所有任务完成或者线程池被关闭。
CallerRunsPolicy
- 新任务处理:当线程池饱和时,新提交的任务不会被线程池中的线程处理,而是由提交任务的线程(通常是主线程)直接执行该任务。这种策略会利用提交任务的线程资源,避免任务被直接丢弃。执行完该任务后,提交任务的线程恢复正常工作。
- 已有线程状态变化:已有线程继续执行它们当前的任务,不受影响。线程池的运行状态同样不会改变,直到所有任务完成或者线程池被关闭。
DiscardPolicy
- 新任务处理:当线程池饱和时,新提交的任务会被直接丢弃,不会抛出任何异常。这意味着新任务不会被执行,也不会被线程池的已有线程重复利用。
- 已有线程状态变化:已有线程继续执行它们当前的任务,不受新任务被丢弃的影响。线程池的运行状态也不会因为新任务被丢弃而改变,直到所有任务完成或者线程池被关闭。
DiscardOldestPolicy
- 新任务处理:当线程池饱和时,会丢弃等待队列中最老的任务(即队列头部的任务),然后尝试将新提交的任务放入等待队列。如果等待队列已满,新任务也会被丢弃。这种策略试图为新任务腾出空间,使得新任务有可能被线程池中的线程执行。
- 已有线程状态变化:已有线程继续执行它们当前的任务,不受影响。但如果被丢弃的任务正在等待执行,那么该任务就不会被执行了。线程池的运行状态同样不会改变,直到所有任务完成或者线程池被关闭。