该策略是线程池的默认策略。使用该策略时,若是线程池队列满了丢掉这个任务而且抛出RejectedExecutionException异常。 源码以下:ide
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { //不作任何处理,直接抛出异常 throw new RejectedExecutionException("xxx"); }
这个策略和AbortPolicy的slient版本,若是线程池队列满了,会直接丢掉这个任务而且不会有任何异常。 源码以下:this
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { //就是一个空的方法 }
这个策略从字面上也很好理解,丢弃最老的。也就是说若是队列满了,会将最先进入队列的任务删掉腾出空间,再尝试加入队列。 由于队列是队尾进,队头出,因此队头元素是最老的,所以每次都是移除对头元素后再尝试入队。 源码以下:.net
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { //移除队头元素 e.getQueue().poll(); //再尝试入队 e.execute(r); } }
使用此策略,若是添加到线程池失败,那么主线程会本身去执行该任务,不会等待线程池中的线程去执行。就像是个急脾气的人,我等不到别人来作这件事就干脆本身干。 源码以下:线程
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { //直接执行run方法 r.run(); } }
......code
原文:https://blog.csdn.net/jgteng/article/details/54411423blog
实例队列
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue(100); SendMsgRejectedExecutionHandler sendMsgRejectedExecutionHandler = new SendMsgRejectedExecutionHandler(); ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(20, 20, 1, TimeUnit.SECONDS, workQueue, sendMsgRejectedExecutionHandler); private class SendMsgRunable implements Runnable { private String phone; private String msg; private Long unionId; public SendMsgRunable(String phone, String msg) { this.phone = phone; this.msg = msg; } @Override public void run() { xxx(phone, msg); } } private class SendMsgRejectedExecutionHandler implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor) { //线程池已满 直接丢弃 //runnable.run(); } }