ThreadPoolExecutor线程池的拒绝策略有 A. bortPolicy:丢弃任务并抛出RejectedExecutionException异常。 B. DiscardPolicy:丢弃任务,但是不抛出异常。 C. DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) D. CallerRunsPolicy:由调用线程处理该任务 ...
4 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。 当线程池中的线程数量大于co...
finalvoidreject(Runnable command) {//reject方法是线程池执行拒绝策略的入口//这里的handler就是拒绝策略//rejectedExecution方法就是拒绝策略内部的逻辑handler.rejectedExecution(command,this); } 然后看下ThreadPoolExecutor线程池提供了哪些拒绝策略: 5.1 AbortPolicy中止策略 publicstaticclassAbortPolicyimplementsRejected...
添加第五个任务时,再也没有地方能存放和执行这个任务了,就会被线程池拒绝添加,执行拒绝策略的rejectedExecution方法,这里就是执行AbortPolicy的rejectedExecution方法直接抛出异常。 最终,只有四个线程能完成运行。后面的都被拒绝了。 2.2 CallerRunsPolicy CallerRunsPolicy在任务...
功能:当触发拒绝策略时,直接抛出拒绝执行的异常,中止策略的意思也就是打断当前执行流程 使用场景:这个就没有特殊的场景了,但是一点要正确处理抛出的异常。ThreadPoolExecutor中默认的策略就是AbortPolicy,ExecutorService接口的系列ThreadPoolExecutor因为都没有显示的设置拒绝策略,所以默认的都是这个。但是请注意,ExecutorServic...
功能:当触发拒绝策略时,只要线程池没有关闭,就由提交任务的当前线程处理。 使用场景:一般在不允许失败的、对性能要求不高、并发量较小的场景下使用,因为线程池一般情况下不会关闭,也就是提交的任务一定会被运行,但是由于是调用者线程自己执行的,当多次提交任务时,就会阻塞后续任务执行,性能和效率自然就慢了。
功能:当触发拒绝策略时,只要线程池没有关闭,就由提交任务的当前线程处理。 使用场景:一般在不允许失败的、对性能要求不高、并发量较小的场景下使用,因为线程池一般情况下不会关闭,也就是提交的任务一定会被运行,但是由于是调用者线程自己执行的,当多次提交任务时,就会阻塞后续任务执行,性能和效率自然就慢了。
ThreadPoolExecutor中默认的拒绝策略就是AbortPolicy直接抛出异常,具体实现如下 publicstaticclassAbortPolicyimplementsRejectedExecutionHandler{publicAbortPolicy(){}publicvoidrejectedExecution(Runnable r,ThreadPoolExecutor e){thrownewRejectedExecutionException("Task "+r.toString()+" rejected from "+e.toString());}...
严格来说,只要实现了RejectedExecutionHandler接口的,都可以作为拒绝策略,这里讨论的是JUC自带的拒绝策略。 上源码…… packagejava.util.concurrent; /** * A handler for tasks that cannot be executed by a {@link ThreadPoolExecutor}. * * @since 1.5 ...
这四个拒绝策略其实一看实现方法就知道很简单。 二、每种拒绝策略 2.1 AbortPolicy ThreadPoolExecutor中默认的拒绝策略就是AbortPolicy。直接抛出异常。 代码语言:javascript 复制 privatestaticfinal RejectedExecutionHandler defaultHandler=newAbortPolicy();