线程池之拒绝策略当线程池中任务队列已满且最⼤线程数maximumPoolSize达到最⼤,此时如果还有任务过来,那么将会触发拒绝策略线程池⼀共内置了四种拒绝策略,线程池默认使⽤AbortPolicy
private static final RejectedExecutionHandler defaultHandler =new AbortPolicy();
ThreadPoolExecutor.AbortPolicy()丢弃任务并抛出RejectedExecutionException异常
public static class AbortPolicy implements RejectedExecutionHandler { public AbortPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { throw new RejectedExecutionException(\"Task \" + r.toString() + \" rejected from \" + e.toString()); }}
ThreadPoolExecutor.DiscardPolicy()丢弃任务,但是不抛出异常。
public static class DiscardPolicy implements RejectedExecutionHandler { public DiscardPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { } }
ThreadPoolExecutor.DiscardOldestPolicy()丢弃队列最前⾯的任务,然后重新提交被拒绝的任务,e.getQueue().poll()将最前⾯的任务弹出
public static class DiscardOldestPolicy implements RejectedExecutionHandler { public DiscardOldestPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { e.getQueue().poll(); e.execute(r); } } }
ThreadPoolExecutor.CallerRunsPolicy()由调⽤线程(提交任务的线程)处理该任务
public static class CallerRunsPolicy implements RejectedExecutionHandler { public CallerRunsPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { r.run(); } } }
⾃定义拒绝策略当上⾯拒绝策略不能满⾜我们的需求,我们需要⾃定义拒绝策略,只需要实现RejectedExecutionHandler就⾏
package thread.customthreadpool.reject;
import java.util.concurrent.RejectedExecutionException;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadPoolExecutor;
/**
* ⾃定义拒绝策略 */
public class MyThreadRejectExecutionHandler implements RejectedExecutionHandler { @Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { /**
* 加⼊⾃⼰的处理逻辑 */
throw new RejectedExecutionException(\"请求异常\"); }}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务