diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java index b418ddcc1..53243cb71 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java @@ -179,7 +179,7 @@ public class CollStreamUtil { Set key = new HashSet<>(); key.addAll(map1.keySet()); key.addAll(map2.keySet()); - Map map = new HashMap<>(); + Map map = MapUtil.newHashMap(key.size()); for (K t : key) { X x = map1.get(t); Y y = map2.get(t); diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/SyncUtil.java b/hutool-core/src/main/java/cn/hutool/core/thread/SyncUtil.java new file mode 100644 index 000000000..5f4601b39 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/thread/SyncUtil.java @@ -0,0 +1,53 @@ +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太长 + * + * @author + * @since 2021/11/10 0010 20:55 + */ +public class SyncUtil { + + private SyncUtil() { + /* Do not new me! */ + } + + /** + * 等待所有任务执行完毕,包裹了异常 + * + * @param tasks 并行任务 + * @throws UndeclaredThrowableException 未受检异常 + */ + public static void wait(CompletableFuture... tasks) { + try { + CompletableFuture.allOf(tasks).get(); + } catch (InterruptedException | ExecutionException e) { + ExceptionUtil.wrapAndThrow(e); + } + } + + /** + * 获取异步任务结果,包裹了异常 + * + * @param task 异步任务 + * @param 任务返回值类型 + * @return 任务返回值 + * @throws RuntimeException 未受检异常 + */ + public static T get(CompletableFuture task) { + RuntimeException exception; + try { + return task.get(); + } catch (InterruptedException | ExecutionException e) { + exception = ExceptionUtil.wrapRuntime(e); + } + throw exception; + } + +} 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 08f30132a..ec92e1a21 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 @@ -1362,10 +1362,9 @@ public class NumberUtil { throw new UtilException("Size is larger than range between begin and end!"); } - Random ran = new Random(); - Set set = new HashSet<>(); + Set set = new HashSet<>(Math.max((int) (size / .75f) + 1, 16)); while (set.size() < size) { - set.add(begin + ran.nextInt(end - begin)); + set.add(begin + RandomUtil.randomInt(end - begin)); } return set.toArray(new Integer[size]); diff --git a/hutool-core/src/test/java/cn/hutool/core/thread/SyncUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/thread/SyncUtilTest.java new file mode 100644 index 000000000..846b4614d --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/thread/SyncUtilTest.java @@ -0,0 +1,36 @@ +package cn.hutool.core.thread; + +import cn.hutool.core.lang.Assert; +import org.junit.Test; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; + +/** + * CompletableFuture工具类测试 + * + * @author + * @since 2021/11/10 0010 21:15 + */ +public class SyncUtilTest { + + @Test + public void waitAndGetTest() { + CompletableFuture hutool = CompletableFuture.supplyAsync(() -> { + ThreadUtil.sleep(3, TimeUnit.SECONDS); + return "hutool"; + }); + CompletableFuture sweater = CompletableFuture.supplyAsync(() -> { + ThreadUtil.sleep(4, TimeUnit.SECONDS); + return "卫衣"; + }); + CompletableFuture warm = CompletableFuture.supplyAsync(() -> { + ThreadUtil.sleep(5, TimeUnit.SECONDS); + return "真暖和"; + }); + // 等待完成 + SyncUtil.wait(hutool, sweater, warm); + // 获取结果 + Assert.isTrue("hutool卫衣真暖和".equals(SyncUtil.get(hutool) + SyncUtil.get(sweater) + SyncUtil.get(warm))); + } +}