Java线程池的拒绝策略是指当任务数量超过线程池的处理能力时,线程池如何处理这些额外的任务,Java线程池提供了四种拒绝策略,分别是:
1、AbortPolicy(默认策略)
2、CallerRunsPolicy
3、DiscardOldestPolicy
4、DiscardPolicy
下面是对这些策略的详细解释:
1. AbortPolicy(默认策略)
当线程池和队列都满了,无法处理新的任务时,AbortPolicy策略会抛出一个RejectedExecutionException
异常,这是默认的拒绝策略。
2. CallerRunsPolicy
当线程池和队列都满了,无法处理新的任务时,CallerRunsPolicy策略会直接在调用者线程中执行这个任务,换句话说,它会将任务放回调用者的队列中,让调用者自己处理。
3. DiscardOldestPolicy
当线程池和队列都满了,无法处理新的任务时,DiscardOldestPolicy策略会丢弃队列中最旧的任务,然后将新任务加入队列。
4. DiscardPolicy
当线程池和队列都满了,无法处理新的任务时,DiscardPolicy策略会直接丢弃新任务,不做任何处理。
下面是一个简单的示例代码,展示了如何使用不同的拒绝策略:
import java.util.concurrent.*; public class ThreadPoolDemo { public static void main(String[] args) { // 创建一个固定大小的线程池 ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), new ThreadPoolExecutor.AbortPolicy()); // 提交任务 for (int i = 0; i < 10; i++) { executor.execute(new Runnable() { @Override public void run() { System.out.println("Task executed by: " + Thread.currentThread().getName()); } }); } // 关闭线程池 executor.shutdown(); } }
在上面的代码中,我们创建了一个固定大小为2的线程池,队列大小为2,拒绝策略为AbortPolicy,然后提交了10个任务,由于线程池和队列的大小限制,最后会有8个任务被拒绝。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/654431.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复