From 9eba7f77cf65b9bfeb1a1a075f979fc0a6e8f809 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 20 May 2023 01:55:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DSystemTimer=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=E8=BF=9B=E7=A8=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/cron/timingwheel/SystemTimer.java | 6 ++++ .../cron/timingwheel/Issue3090Test.java | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 hutool-cron/src/test/java/org/dromara/hutool/cron/timingwheel/Issue3090Test.java 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("线程池已经关闭"); + } +}