From 8fda1b9ac5246b1a43af4b7fa38472a9766c37ca Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 10 Nov 2021 23:12:53 +0800 Subject: [PATCH] add AsyncUtil --- CHANGELOG.md | 1 + .../thread/{SyncUtil.java => AsyncUtil.java} | 35 ++++++++++------- .../hutool/core/thread/ThreadException.java | 38 +++++++++++++++++++ .../java/cn/hutool/core/util/NumberUtil.java | 5 +-- .../{SyncUtilTest.java => AsyncUtilTest.java} | 14 ++++--- .../cn/hutool/core/util/NumberUtilTest.java | 6 +++ 6 files changed, 76 insertions(+), 23 deletions(-) rename hutool-core/src/main/java/cn/hutool/core/thread/{SyncUtil.java => AsyncUtil.java} (55%) create mode 100644 hutool-core/src/main/java/cn/hutool/core/thread/ThreadException.java rename hutool-core/src/test/java/cn/hutool/core/thread/{SyncUtilTest.java => AsyncUtilTest.java} (69%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f9e9ef1e..7bbd7a4ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ # 5.7.17 (2021-11-10) ### 🐣新特性 +* 【core 】 增加AsyncUtil(pr#457@Gitee) ### 🐞Bug修复 * 【core 】 修复FileResource构造fileName参数无效问题(issue#1942@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/SyncUtil.java b/hutool-core/src/main/java/cn/hutool/core/thread/AsyncUtil.java similarity index 55% rename from hutool-core/src/main/java/cn/hutool/core/thread/SyncUtil.java rename to hutool-core/src/main/java/cn/hutool/core/thread/AsyncUtil.java index 5f4601b39..7a0d9fdf2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/SyncUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/AsyncUtil.java @@ -1,22 +1,17 @@ package cn.hutool.core.thread; -import cn.hutool.core.exceptions.ExceptionUtil; - import java.lang.reflect.UndeclaredThrowableException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; /** - * CompletableFuture工具类,叫CompletableFutureUtil太长 + * {@link CompletableFuture}异步工具类
+ * {@link CompletableFuture} 是 Future 的改进,可以通过传入回调对象,在任务完成后调用之 * * @author - * @since 2021/11/10 0010 20:55 + * @since 5.7.17 */ -public class SyncUtil { - - private SyncUtil() { - /* Do not new me! */ - } +public class AsyncUtil { /** * 等待所有任务执行完毕,包裹了异常 @@ -24,11 +19,25 @@ public class SyncUtil { * @param tasks 并行任务 * @throws UndeclaredThrowableException 未受检异常 */ - public static void wait(CompletableFuture... tasks) { + public static void waitAll(CompletableFuture... tasks) { try { CompletableFuture.allOf(tasks).get(); } catch (InterruptedException | ExecutionException e) { - ExceptionUtil.wrapAndThrow(e); + throw new ThreadException(e); + } + } + + /** + * 等待任意一个任务执行完毕,包裹了异常 + * + * @param tasks 并行任务 + * @throws UndeclaredThrowableException 未受检异常 + */ + public static void waitAny(CompletableFuture... tasks) { + try { + CompletableFuture.anyOf(tasks).get(); + } catch (InterruptedException | ExecutionException e) { + throw new ThreadException(e); } } @@ -41,13 +50,11 @@ public class SyncUtil { * @throws RuntimeException 未受检异常 */ public static T get(CompletableFuture task) { - RuntimeException exception; try { return task.get(); } catch (InterruptedException | ExecutionException e) { - exception = ExceptionUtil.wrapRuntime(e); + throw new ThreadException(e); } - throw exception; } } diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/ThreadException.java b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadException.java new file mode 100644 index 000000000..b61963b2c --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadException.java @@ -0,0 +1,38 @@ +package cn.hutool.core.thread; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.util.StrUtil; + +/** + * 工具类异常 + * + * @author looly + * @since 5.7.17 + */ +public class ThreadException extends RuntimeException { + private static final long serialVersionUID = 5253124428623713216L; + + public ThreadException(Throwable e) { + super(ExceptionUtil.getMessage(e), e); + } + + public ThreadException(String message) { + super(message); + } + + public ThreadException(String messageTemplate, Object... params) { + super(StrUtil.format(messageTemplate, params)); + } + + public ThreadException(String message, Throwable throwable) { + super(message, throwable); + } + + public ThreadException(String message, Throwable throwable, boolean enableSuppression, boolean writableStackTrace) { + super(message, throwable, enableSuppression, writableStackTrace); + } + + public ThreadException(Throwable throwable, String messageTemplate, Object... params) { + super(StrUtil.format(messageTemplate, params), throwable); + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index ec92e1a21..8953e48b0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -12,7 +12,6 @@ import java.text.NumberFormat; import java.text.ParseException; import java.util.Collection; import java.util.HashSet; -import java.util.Random; import java.util.Set; /** @@ -1362,12 +1361,12 @@ public class NumberUtil { throw new UtilException("Size is larger than range between begin and end!"); } - Set set = new HashSet<>(Math.max((int) (size / .75f) + 1, 16)); + Set set = new HashSet<>(size, 1); while (set.size() < size) { set.add(begin + RandomUtil.randomInt(end - begin)); } - return set.toArray(new Integer[size]); + return set.toArray(new Integer[0]); } // ------------------------------------------------------------------------------------------- range diff --git a/hutool-core/src/test/java/cn/hutool/core/thread/SyncUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/thread/AsyncUtilTest.java similarity index 69% rename from hutool-core/src/test/java/cn/hutool/core/thread/SyncUtilTest.java rename to hutool-core/src/test/java/cn/hutool/core/thread/AsyncUtilTest.java index 846b4614d..f6a00a486 100644 --- a/hutool-core/src/test/java/cn/hutool/core/thread/SyncUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/thread/AsyncUtilTest.java @@ -1,6 +1,7 @@ package cn.hutool.core.thread; import cn.hutool.core.lang.Assert; +import org.junit.Ignore; import org.junit.Test; import java.util.concurrent.CompletableFuture; @@ -12,25 +13,26 @@ import java.util.concurrent.TimeUnit; * @author * @since 2021/11/10 0010 21:15 */ -public class SyncUtilTest { +public class AsyncUtilTest { @Test + @Ignore public void waitAndGetTest() { CompletableFuture hutool = CompletableFuture.supplyAsync(() -> { - ThreadUtil.sleep(3, TimeUnit.SECONDS); + ThreadUtil.sleep(1, TimeUnit.SECONDS); return "hutool"; }); CompletableFuture sweater = CompletableFuture.supplyAsync(() -> { - ThreadUtil.sleep(4, TimeUnit.SECONDS); + ThreadUtil.sleep(2, TimeUnit.SECONDS); return "卫衣"; }); CompletableFuture warm = CompletableFuture.supplyAsync(() -> { - ThreadUtil.sleep(5, TimeUnit.SECONDS); + ThreadUtil.sleep(3, TimeUnit.SECONDS); return "真暖和"; }); // 等待完成 - SyncUtil.wait(hutool, sweater, warm); + AsyncUtil.waitAll(hutool, sweater, warm); // 获取结果 - Assert.isTrue("hutool卫衣真暖和".equals(SyncUtil.get(hutool) + SyncUtil.get(sweater) + SyncUtil.get(warm))); + Assert.isTrue("hutool卫衣真暖和".equals(AsyncUtil.get(hutool) + AsyncUtil.get(sweater) + AsyncUtil.get(warm))); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index ffdbd953e..137c849cd 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java @@ -400,4 +400,10 @@ public class NumberUtilTest { final String s = new BigDecimal(num).toPlainString(); Assert.assertEquals("5344342.34", s); } + + @Test + public void generateBySetTest(){ + final Integer[] integers = NumberUtil.generateBySet(10, 100, 5); + Assert.assertEquals(5, integers.length); + } }