diff --git a/spring-core/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java b/spring-core/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java index 5aad53b19f..008de2f646 100644 --- a/spring-core/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java +++ b/spring-core/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java @@ -260,9 +260,10 @@ public class SimpleAsyncTaskExecutor extends CustomizableThreadCreator if (this.virtualThreadDelegate != null) { this.virtualThreadDelegate.startVirtualThread(nextThreadName(), task); } - - Thread thread = (this.threadFactory != null ? this.threadFactory.newThread(task) : createThread(task)); - thread.start(); + else { + Thread thread = (this.threadFactory != null ? this.threadFactory.newThread(task) : createThread(task)); + thread.start(); + } } diff --git a/spring-core/src/test/java21/org/springframework/core/task/VirtualThreadTaskExecutorTests.java b/spring-core/src/test/java21/org/springframework/core/task/VirtualThreadTaskExecutorTests.java index 204c715e28..bdac3cdd17 100644 --- a/spring-core/src/test/java21/org/springframework/core/task/VirtualThreadTaskExecutorTests.java +++ b/spring-core/src/test/java21/org/springframework/core/task/VirtualThreadTaskExecutorTests.java @@ -16,6 +16,8 @@ package org.springframework.core.task; +import java.util.concurrent.atomic.AtomicInteger; + import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -34,6 +36,7 @@ class VirtualThreadTaskExecutorTests { executeAndWait(executor, task, monitor); assertThat(task.getThreadName()).isEmpty(); assertThat(task.isVirtual()).isTrue(); + assertThat(task.runtCount()).isOne(); } @Test @@ -44,6 +47,7 @@ class VirtualThreadTaskExecutorTests { executeAndWait(executor, task, monitor); assertThat(task.getThreadName()).isEqualTo("test-0"); assertThat(task.isVirtual()).isTrue(); + assertThat(task.runtCount()).isOne(); } @Test @@ -54,6 +58,7 @@ class VirtualThreadTaskExecutorTests { executeAndWait(executor, task, monitor); assertThat(task.getThreadName()).isEqualTo("test"); assertThat(task.isVirtual()).isTrue(); + assertThat(task.runtCount()).isOne(); } @Test @@ -66,6 +71,7 @@ class VirtualThreadTaskExecutorTests { executeAndWait(executor, task, monitor); assertThat(task.getThreadName()).startsWith(customPrefix); assertThat(task.isVirtual()).isTrue(); + assertThat(task.runtCount()).isOne(); } private void executeAndWait(TaskExecutor executor, Runnable task, Object monitor) { @@ -115,6 +121,8 @@ class VirtualThreadTaskExecutorTests { private static final class ThreadNameHarvester extends AbstractNotifyingRunnable { + private final AtomicInteger runCount = new AtomicInteger(); + private String threadName; private boolean virtual; @@ -131,11 +139,16 @@ class VirtualThreadTaskExecutorTests { return this.virtual; } + public int runtCount() { + return this.runCount.get(); + } + @Override protected void doRun() { Thread thread = Thread.currentThread(); this.threadName = thread.getName(); this.virtual = thread.isVirtual(); + runCount.incrementAndGet(); } }