修复SystemTimer无法结束进程问题

This commit is contained in:
Looly 2023-05-20 01:55:40 +08:00
parent 25eca5dba7
commit 9eba7f77cf
2 changed files with 34 additions and 0 deletions

View File

@ -43,6 +43,7 @@ public class SystemTimer {
* 轮询delayQueue获取过期任务线程 * 轮询delayQueue获取过期任务线程
*/ */
private ExecutorService bossThreadPool; private ExecutorService bossThreadPool;
private volatile boolean isRunning;
/** /**
* 构造 * 构造
@ -68,6 +69,7 @@ public class SystemTimer {
*/ */
public SystemTimer start() { public SystemTimer start() {
bossThreadPool = ThreadUtil.newSingleExecutor(); bossThreadPool = ThreadUtil.newSingleExecutor();
isRunning = true;
bossThreadPool.submit(() -> { bossThreadPool.submit(() -> {
while (true) { while (true) {
if(!advanceClock()){ if(!advanceClock()){
@ -82,6 +84,7 @@ public class SystemTimer {
* 强制结束 * 强制结束
*/ */
public void stop(){ public void stop(){
this.isRunning = false;
this.bossThreadPool.shutdown(); this.bossThreadPool.shutdown();
} }
@ -103,6 +106,9 @@ public class SystemTimer {
* @return 是否结束 * @return 是否结束
*/ */
private boolean advanceClock() { private boolean advanceClock() {
if(!isRunning){
return false;
}
try { try {
final TimerTaskList timerTaskList = poll(); final TimerTaskList timerTaskList = poll();
if (null != timerTaskList) { if (null != timerTaskList) {

View File

@ -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("线程池已经关闭");
}
}