From 2c1d10d952274afe76d0ec5463ad44f13dcf5173 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 14 May 2021 16:58:33 +0800 Subject: [PATCH] add stop --- CHANGELOG.md | 3 +- .../cn/hutool/core/thread/SyncFinisher.java | 55 +++++++++++++------ .../cn/hutool/core/util/RandomUtilTest.java | 8 +-- 3 files changed, 45 insertions(+), 21 deletions(-) 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 { } } + /** + * 结束线程池。此方法执行两种情况: + *
    + *
  1. 执行start(true)后,调用此方法结束线程池回收资源
  2. + *
  3. 执行start(false)后,用户自行判断结束点执行此方法
  4. + *
+ * + * @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() {