diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java
index 3418bd7cb..28c526135 100644
--- a/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java
@@ -1,5 +1,7 @@
package cn.hutool.core.thread;
+import cn.hutool.core.thread.rejected.RejectedExecutionHandlerUtility;
+
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
@@ -8,6 +10,7 @@ import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
@@ -40,6 +43,114 @@ public class ThreadUtil {
return builder.build();
}
+ /**
+ * 获取一个新的线程池,默认的策略如下
+ *
+ * 1. 核心线程数与最大线程数为nThreads指定的大小 + * 2. 默认使用LinkedBlockingQueue,默认队列大小为1024 + *+ * + * @param nThreads 线程池大小 + * @param threadNamePrefix 线程名称前缀 + * @return ExecutorService + */ + public static ExecutorService newFixedExecutor(int nThreads, String threadNamePrefix) { + ThreadFactory threadFactory = ThreadFactoryBuilder.create().setNamePrefix(threadNamePrefix).build(); + ExecutorBuilder builder = ExecutorBuilder.create().setThreadFactory(threadFactory); + if (nThreads > 0) { + builder.setCorePoolSize(nThreads) + .setMaxPoolSize(nThreads); + } + return builder.build(); + } + + /** + * 获取一个新的线程池,默认的策略如下
+ * 1. 核心线程数与最大线程数为nThreads指定的大小
+ * 2. 默认使用LinkedBlockingQueue,默认队列大小为1024
+ * 3. 当执行拒绝策略的时候会处于阻塞状态,直到能添加到队列中或者被{@link Thread#interrupt()}中断
+ *
+ *
+ * @param nThreads 线程池大小
+ * @param threadNamePrefix 线程名称前缀
+ * @return ExecutorService
+ */
+ public static ExecutorService newFixedBlockedExecutor(int nThreads, String threadNamePrefix) {
+ ThreadFactory threadFactory = ThreadFactoryBuilder.create().setNamePrefix(threadNamePrefix).build();
+ ExecutorBuilder builder = ExecutorBuilder.create()
+ .setCorePoolSize(nThreads)
+ .setMaxPoolSize(nThreads)
+ .setThreadFactory(threadFactory)
+ .setHandler(new RejectedExecutionHandlerUtility.BlockPolicy());
+ return builder.build();
+ }
+
+ /**
+ * 获取一个新的线程池,默认的策略如下+ * 1. 核心线程数与最大线程数为nThreads指定的大小 + * 2. 默认使用LinkedBlockingQueue + *+ * + * @param nThreads 线程池大小 + * @param maximumQueueSize 队列大小 + * @param threadNamePrefix 线程名称前缀 + * @return ExecutorService + */ + public static ExecutorService newFixedExecutor(int nThreads, int maximumQueueSize, String threadNamePrefix) { + return newFixedExecutor(nThreads, maximumQueueSize, threadNamePrefix, null); + } + + /** + * 获取一个新的线程池,默认的策略如下
+ * 1. 核心线程数与最大线程数为nThreads指定的大小
+ * 2. 默认使用LinkedBlockingQueue
+ * 3. 当执行拒绝策略的时候会处于阻塞状态,直到能添加到队列中或者被{@link Thread#interrupt()}中断
+ *
+ *
+ * @param nThreads 线程池大小
+ * @param threadNamePrefix 线程名称前缀
+ * @return ExecutorService
+ */
+ public static ExecutorService newFixedBlockingExecutor(int nThreads, int maximumQueueSize, String threadNamePrefix) {
+ return newFixedExecutor(nThreads,
+ maximumQueueSize,
+ threadNamePrefix,
+ new RejectedExecutionHandlerUtility.BlockPolicy());
+ }
+
+ /**
+ * 获得一个新的线程池,默认策略如下+ * 1. 核心线程数与最大线程数为nThreads指定的大小 + * 2. 默认使用LinkedBlockingQueue + *+ * + * @param nThreads 线程池大小 + * @param maximumQueueSize 队列大小 + * @param threadNamePrefix 线程名称前缀 + * @param handler 拒绝策略 + * @return ExecutorService + */ + public static ExecutorService newFixedExecutor(int nThreads, + int maximumQueueSize, + String threadNamePrefix, + RejectedExecutionHandler handler) { + + ThreadFactory threadFactory = ThreadFactoryBuilder.create().setNamePrefix(threadNamePrefix).build(); + + ExecutorBuilder builder = ExecutorBuilder.create() + .setCorePoolSize(nThreads) + .setMaxPoolSize(nThreads) + .setWorkQueue(new LinkedBlockingQueue<>(maximumQueueSize)) + .setThreadFactory(threadFactory) + .setHandler(handler); + + return builder.build(); + } + /** * 获得一个新的线程池,默认的策略如下: *
diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/rejected/RejectedExecutionHandlerUtility.java b/hutool-core/src/main/java/cn/hutool/core/thread/rejected/RejectedExecutionHandlerUtility.java
new file mode 100644
index 000000000..d85a6f907
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/thread/rejected/RejectedExecutionHandlerUtility.java
@@ -0,0 +1,32 @@
+package cn.hutool.core.thread.rejected;
+
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 线程池拒绝策略工具类
+ *
+ * @author luozongle
+ */
+public class RejectedExecutionHandlerUtility {
+
+ /**
+ * 当任务队列过长时处于阻塞状态,直到添加到队列中
+ * 如果阻塞过程中被中断,就会抛出{@link InterruptedException}异常
+ */
+ public static class BlockPolicy implements RejectedExecutionHandler {
+
+ public BlockPolicy() {
+ }
+
+ @Override
+ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
+ try {
+ e.getQueue().put(r);
+ } catch (InterruptedException ex) {
+ throw new RejectedExecutionException("Task " + r + " rejected from " + e);
+ }
+ }
+ }
+}