該策略是線程池的默認策略。使用該策略時,若是線程池隊列滿了丟掉這個任務而且拋出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(); } }