From 2cea7ca5afa5f78ae3475fa24ee1166294883c6e Mon Sep 17 00:00:00 2001 From: Konstantin Shandurenko Date: Mon, 11 Apr 2022 21:26:59 +0300 Subject: [PATCH] Async tasks cancellation fix (#907) --- .../minestom/server/timer/SchedulerImpl.java | 7 ++++++- .../minestom/server/timer/TestScheduler.java | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/timer/SchedulerImpl.java b/src/main/java/net/minestom/server/timer/SchedulerImpl.java index f8fd76b8b..145870f52 100644 --- a/src/main/java/net/minestom/server/timer/SchedulerImpl.java +++ b/src/main/java/net/minestom/server/timer/SchedulerImpl.java @@ -79,7 +79,12 @@ final class SchedulerImpl implements Scheduler { // By either adding the task to the execution queue or submitting it to the pool switch (task.executionType()) { case SYNC -> taskQueue.offer(task); - case ASYNC -> EXECUTOR.submit(() -> handleTask(task)); + case ASYNC -> EXECUTOR.submit(() -> { + if (!task.isAlive()) { + return; + } + handleTask(task); + }); } } diff --git a/src/test/java/net/minestom/server/timer/TestScheduler.java b/src/test/java/net/minestom/server/timer/TestScheduler.java index ed4a440c3..fdbb08082 100644 --- a/src/test/java/net/minestom/server/timer/TestScheduler.java +++ b/src/test/java/net/minestom/server/timer/TestScheduler.java @@ -2,6 +2,7 @@ package net.minestom.server.timer; import org.junit.jupiter.api.Test; +import java.time.Duration; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; @@ -66,6 +67,22 @@ public class TestScheduler { assertFalse(result.get(), "Task should be cancelled"); } + @Test + public void cancelAsyncDelayedTask() throws InterruptedException { + Scheduler scheduler = Scheduler.newScheduler(); + AtomicBoolean result = new AtomicBoolean(false); + var task = scheduler.buildTask(() -> result.set(true)) + .delay(Duration.ofMillis(1)) + .executionType(ExecutionType.ASYNC) + .schedule(); + assertTrue(task.isAlive(), "Task should still be alive"); + task.cancel(); + assertFalse(task.isAlive(), "Task should not be alive anymore"); + scheduler.process(); + Thread.sleep(10L); + assertFalse(result.get(), "Task should be cancelled"); + } + @Test public void parkTask() { Scheduler scheduler = Scheduler.newScheduler();