diff --git a/hutool-cron/src/main/java/org/dromara/hutool/cron/timingwheel/SystemTimer.java b/hutool-cron/src/main/java/org/dromara/hutool/cron/timingwheel/SystemTimer.java index 340b9d327..85f98c40e 100644 --- a/hutool-cron/src/main/java/org/dromara/hutool/cron/timingwheel/SystemTimer.java +++ b/hutool-cron/src/main/java/org/dromara/hutool/cron/timingwheel/SystemTimer.java @@ -43,6 +43,7 @@ public class SystemTimer { * 轮询delayQueue获取过期任务线程 */ private ExecutorService bossThreadPool; + private volatile boolean isRunning; /** * 构造 @@ -68,6 +69,7 @@ public class SystemTimer { */ public SystemTimer start() { bossThreadPool = ThreadUtil.newSingleExecutor(); + isRunning = true; bossThreadPool.submit(() -> { while (true) { if(!advanceClock()){ @@ -82,6 +84,7 @@ public class SystemTimer { * 强制结束 */ public void stop(){ + this.isRunning = false; this.bossThreadPool.shutdown(); } @@ -103,6 +106,9 @@ public class SystemTimer { * @return 是否结束 */ private boolean advanceClock() { + if(!isRunning){ + return false; + } try { final TimerTaskList timerTaskList = poll(); if (null != timerTaskList) { diff --git a/hutool-cron/src/test/java/org/dromara/hutool/cron/timingwheel/Issue3090Test.java b/hutool-cron/src/test/java/org/dromara/hutool/cron/timingwheel/Issue3090Test.java new file mode 100644 index 000000000..ecfa3192b --- /dev/null +++ b/hutool-cron/src/test/java/org/dromara/hutool/cron/timingwheel/Issue3090Test.java @@ -0,0 +1,28 @@ +/* + * 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.cron.timingwheel; + +public class Issue3090Test { + public static void main(String[] args) { + SystemTimer timer = new SystemTimer(); + timer.setDelayQueueTimeout(1000); + timer.start(); + timer.addTask(new TimerTask(() -> { + System.out.println(1); + System.out.println("任务已经完成"); + }, 1000)); + + timer.stop(); + System.out.println("线程池已经关闭"); + } +}