From 596529f2d53e187ac7766188104d30099961115b Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 15 May 2023 19:25:12 +0800 Subject: [PATCH] fix code --- .../hutool/core/thread/SyncFinisher.java | 34 ++++++++++++++++- .../hutool/core/thread/SyncFinisherTest.java | 38 +++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100755 hutool-core/src/test/java/org/dromara/hutool/core/thread/SyncFinisherTest.java diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/thread/SyncFinisher.java b/hutool-core/src/main/java/org/dromara/hutool/core/thread/SyncFinisher.java index b1025873e..6ae774928 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/thread/SyncFinisher.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/thread/SyncFinisher.java @@ -13,6 +13,7 @@ package org.dromara.hutool.core.thread; import org.dromara.hutool.core.exception.HutoolException; +import org.dromara.hutool.core.lang.Console; import java.io.Closeable; import java.util.LinkedHashSet; @@ -53,6 +54,11 @@ public class SyncFinisher implements Closeable { */ private CountDownLatch endLatch; + /** + * 异常处理 + */ + private Thread.UncaughtExceptionHandler exceptionHandler; + /** * 构造 * @@ -75,6 +81,17 @@ public class SyncFinisher implements Closeable { return this; } + /** + * 设置异常处理 + * + * @param exceptionHandler 异常处理器 + * @return this + */ + public SyncFinisher setExceptionHandler(final Thread.UncaughtExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } + /** * 增加定义的线程数同等数量的worker * @@ -139,10 +156,11 @@ public class SyncFinisher implements Closeable { endLatch = new CountDownLatch(workers.size()); if (null == this.executorService || this.executorService.isShutdown()) { - this.executorService = ThreadUtil.newExecutor(threadSize); + this.executorService = buildExecutor(); } for (final Worker worker : workers) { - executorService.submit(worker); + //executorService.submit(worker); + executorService.execute(worker); } // 保证所有worker同时开始 this.beginLatch.countDown(); @@ -241,4 +259,16 @@ public class SyncFinisher implements Closeable { */ public abstract void work(); } + + /** + * 构建线程池,加入了自定义的异常处理 + * + * @return {@link ExecutorService} + */ + private ExecutorService buildExecutor() { + return ExecutorBuilder.of() + .setCorePoolSize(threadSize) + .setThreadFactory(new NamedThreadFactory("hutool-", null, false, exceptionHandler)) + .build(); + } } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/thread/SyncFinisherTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/thread/SyncFinisherTest.java new file mode 100755 index 000000000..5887c5197 --- /dev/null +++ b/hutool-core/src/test/java/org/dromara/hutool/core/thread/SyncFinisherTest.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.thread; + +import org.dromara.hutool.core.lang.Console; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class SyncFinisherTest { + + /** + * https://gitee.com/dromara/hutool/issues/I716SX + */ + @Test + void executeExceptionTest() { + final SyncFinisher syncFinisher = new SyncFinisher(10); + syncFinisher.addWorker(()->{ + Console.log(Integer.parseInt("XYZ"));//这里会抛RuntimeException + }); + + syncFinisher.setExceptionHandler((t, e) -> { + Assertions.assertEquals("For input string: \"XYZ\"", e.getMessage()); + }); + + syncFinisher.start(); + syncFinisher.close(); + } +}