diff --git a/CHANGELOG.md b/CHANGELOG.md index dc6324315..4d9fbcd4e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.19.M1 (2023-05-19) +# 5.8.19.M1 (2023-05-20) ### 🐣新特性 * 【db 】 优化HttpRequest.toString()内容打印(issue#3072@Github) @@ -24,6 +24,7 @@ * 【core 】 修复NumberUtil mul 传入null的string入参报错问题(issue#I70JB3@Gitee) * 【core 】 修复ZipReader.get调用reset异常问题(issue#3099@Github) * 【core 】 修复FileUtil.createTempFile可能导致的漏洞(issue#3103@Github) +* 【cron 】 修复SystemTimer无法结束进程问题(issue#3090@Github) ------------------------------------------------------------------------------------------------------------- # 5.8.18 (2023-04-27) diff --git a/hutool-cron/src/main/java/cn/hutool/cron/timingwheel/SystemTimer.java b/hutool-cron/src/main/java/cn/hutool/cron/timingwheel/SystemTimer.java index 9d640fa02..b80da26ef 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/timingwheel/SystemTimer.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/timingwheel/SystemTimer.java @@ -31,6 +31,7 @@ public class SystemTimer { * 轮询delayQueue获取过期任务线程 */ private ExecutorService bossThreadPool; + private volatile boolean isRunning; /** * 构造 @@ -56,6 +57,7 @@ public class SystemTimer { */ public SystemTimer start() { bossThreadPool = ThreadUtil.newSingleExecutor(); + isRunning = true; bossThreadPool.submit(() -> { while (true) { if(false == advanceClock()){ @@ -70,6 +72,7 @@ public class SystemTimer { * 强制结束 */ public void stop(){ + this.isRunning = false; this.bossThreadPool.shutdown(); } @@ -91,6 +94,9 @@ public class SystemTimer { * @return 是否结束 */ private boolean advanceClock() { + if(false == isRunning){ + return false; + } try { TimerTaskList timerTaskList = poll(); if (null != timerTaskList) { diff --git a/hutool-cron/src/test/java/cn/hutool/cron/timingwheel/Issue3090Test.java b/hutool-cron/src/test/java/cn/hutool/cron/timingwheel/Issue3090Test.java new file mode 100644 index 000000000..61476521d --- /dev/null +++ b/hutool-cron/src/test/java/cn/hutool/cron/timingwheel/Issue3090Test.java @@ -0,0 +1,30 @@ +/* + * 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 cn.hutool.cron.timingwheel; + +import cn.hutool.core.lang.Console; + +public class Issue3090Test { + public static void main(String[] args) { + final SystemTimer timer = new SystemTimer(); + timer.setDelayQueueTimeout(1000); + timer.start(); + timer.addTask(new TimerTask(() -> { + Console.log(1); + Console.log("任务已经完成"); + }, 1000)); + + timer.stop(); + Console.log("线程池已经关闭"); + } +}