diff --git a/CHANGELOG.md b/CHANGELOG.md
index 710b73dee..373e45c32 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,11 +3,12 @@
-------------------------------------------------------------------------------------------------------------
-# 5.6.6 (2021-05-11)
+# 5.6.6 (2021-05-14)
### 🐣新特性
* 【cron 】 增加时间轮简单实现
* 【core 】 BeanUtil.copyToList增加重载(pr#321@Gitee)
+* 【core 】 SyncFinisher增加stop方法(issue#1578@Github)
### 🐞Bug修复
diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java b/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java
index b11320438..3bb074b4e 100644
--- a/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java
+++ b/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java
@@ -11,7 +11,7 @@ import java.util.concurrent.ExecutorService;
/**
* 线程同步结束器
* 在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
- *
+ *
*
* ps:
* //模拟1000个线程并发
@@ -21,8 +21,8 @@ import java.util.concurrent.ExecutorService;
* });
* sf.start()
*
- *
- *
+ *
+ *
* @author Looly
* @since 4.1.15
*/
@@ -30,7 +30,7 @@ public class SyncFinisher {
private final Set workers;
private final int threadSize;
- private final ExecutorService executorService;
+ private ExecutorService executorService;
private boolean isBeginAtSameTime;
/** 启动同步器,用于保证所有worker线程同时开始 */
@@ -40,19 +40,18 @@ public class SyncFinisher {
/**
* 构造
- *
+ *
* @param threadSize 线程数
*/
public SyncFinisher(int threadSize) {
this.beginLatch = new CountDownLatch(1);
this.threadSize = threadSize;
- this.executorService = ThreadUtil.newExecutor(threadSize);
this.workers = new LinkedHashSet<>();
}
/**
* 设置是否所有worker线程同时开始
- *
+ *
* @param isBeginAtSameTime 是否所有worker线程同时开始
* @return this
*/
@@ -63,7 +62,7 @@ public class SyncFinisher {
/**
* 增加定义的线程数同等数量的worker
- *
+ *
* @param runnable 工作线程
* @return this
*/
@@ -81,7 +80,7 @@ public class SyncFinisher {
/**
* 增加工作线程
- *
+ *
* @param runnable 工作线程
* @return this
*/
@@ -96,7 +95,7 @@ public class SyncFinisher {
/**
* 增加工作线程
- *
+ *
* @param worker 工作线程
* @return this
*/
@@ -106,20 +105,26 @@ public class SyncFinisher {
}
/**
- * 开始工作
+ * 开始工作
+ * 执行此方法后如果不再重复使用此对象,需调用{@link #stop()}关闭回收资源。
*/
public void start() {
start(true);
}
/**
- * 开始工作
- *
+ * 开始工作
+ * 执行此方法后如果不再重复使用此对象,需调用{@link #stop()}关闭回收资源。
+ *
* @param sync 是否阻塞等待
* @since 4.5.8
*/
public void start(boolean sync) {
endLatch = new CountDownLatch(workers.size());
+
+ if(null == this.executorService || this.executorService.isShutdown()){
+ this.executorService = ThreadUtil.newExecutor(threadSize);
+ }
for (Worker worker : workers) {
executorService.submit(worker);
}
@@ -135,9 +140,27 @@ public class SyncFinisher {
}
}
+ /**
+ * 结束线程池。此方法执行两种情况:
+ *
+ * - 执行start(true)后,调用此方法结束线程池回收资源
+ * - 执行start(false)后,用户自行判断结束点执行此方法
+ *
+ *
+ * @since 5.6.6
+ */
+ public void stop(){
+ if(null != this.executorService){
+ this.executorService.shutdown();
+ }
+ this.executorService = null;
+
+ clearWorker();
+ }
+
/**
* 等待所有Worker工作结束,否则阻塞
- *
+ *
* @throws InterruptedException 用户中断
* @deprecated 使用start方法指定是否阻塞等待
*/
@@ -159,7 +182,7 @@ public class SyncFinisher {
/**
* 剩余任务数
- *
+ *
* @return 剩余任务数
*/
public long count() {
@@ -168,7 +191,7 @@ public class SyncFinisher {
/**
* 工作者,为一个线程
- *
+ *
* @author xiaoleilu
*
*/
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/RandomUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/RandomUtilTest.java
index fc17748cc..9d5108a9b 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/RandomUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/RandomUtilTest.java
@@ -11,25 +11,25 @@ import java.util.List;
import java.util.Set;
public class RandomUtilTest {
-
+
@Test
public void randomEleSetTest(){
Set set = RandomUtil.randomEleSet(CollUtil.newArrayList(1, 2, 3, 4, 5, 6), 2);
Assert.assertEquals(set.size(), 2);
}
-
+
@Test
public void randomElesTest(){
List result = RandomUtil.randomEles(CollUtil.newArrayList(1, 2, 3, 4, 5, 6), 2);
Assert.assertEquals(result.size(), 2);
}
-
+
@Test
public void randomDoubleTest() {
double randomDouble = RandomUtil.randomDouble(0, 1, 0, RoundingMode.HALF_UP);
Assert.assertTrue(randomDouble <= 1);
}
-
+
@Test
@Ignore
public void randomBooleanTest() {