From 4670dccb67e88a8a6841b4df0fba75c5423927ca Mon Sep 17 00:00:00 2001 From: witt Date: Fri, 17 Jun 2022 11:55:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BA=BF=E7=A8=8B=E6=B1=A0?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=97=B6=EF=BC=8C=E9=98=BB=E5=A1=9E=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E4=BB=8D=E7=84=B6=E5=8F=AF=E4=BB=A5=E5=B0=86=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=B7=BB=E5=8A=A0=E5=88=B0=E7=BA=BF=E7=A8=8B=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/thread/BlockPolicy.java | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java b/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java index 8128a483b..745c00dc5 100755 --- a/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java @@ -3,6 +3,7 @@ package cn.hutool.core.thread; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; +import java.util.function.Consumer; /** * 当任务队列过长时处于阻塞状态,直到添加到队列中 @@ -14,15 +15,35 @@ import java.util.concurrent.ThreadPoolExecutor; */ public class BlockPolicy implements RejectedExecutionHandler { + /** + * 线程池关闭时,为避免任务丢失,留下处理方法 + * 如果需要由调用方来运行,可以{@code new BlockPolicy(Runnable::run)} + */ + private final Consumer handlerwhenshutdown; + + public BlockPolicy(final Consumer handlerwhenshutdown) { + this.handlerwhenshutdown = handlerwhenshutdown; + } + public BlockPolicy() { + this(null); } @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { - try { - e.getQueue().put(r); - } catch (InterruptedException ex) { - throw new RejectedExecutionException("Task " + r + " rejected from " + e); + // 线程池未关闭时,阻塞等待 + if(!e.isShutdown()){ + try { + e.getQueue().put(r); + } catch (InterruptedException ex) { + throw new RejectedExecutionException("Task " + r + " rejected from " + e); + } + return; + } + + // 当设置了关闭时候的处理 + if(null != handlerwhenshutdown){ + handlerwhenshutdown.accept(r); } } }