From 60a59109f7f39e8243acfdd3667bf2fa2f64d81e Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Wed, 18 Feb 2026 11:08:15 +1100 Subject: [PATCH] LDEV-6115 enable virtual threads for java 25+ https://luceeserver.atlassian.net/browse/LDEV-6115 --- core/src/main/java/lucee/runtime/thread/ThreadUtil.java | 7 ++++--- .../java/lucee/runtime/util/threading/StatmentClose.java | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/lucee/runtime/thread/ThreadUtil.java b/core/src/main/java/lucee/runtime/thread/ThreadUtil.java index e8ae074f82c..b31caccdec9 100755 --- a/core/src/main/java/lucee/runtime/thread/ThreadUtil.java +++ b/core/src/main/java/lucee/runtime/thread/ThreadUtil.java @@ -54,7 +54,8 @@ public final class ThreadUtil { - private static final boolean ALLOW_FUTURE_THREADS = false; + // virtual threads are safe from Java 25+ (JEP 491: synchronized no longer pins virtual threads) + private static final boolean ALLOW_VIRTUAL_THREADS = SystemUtil.JAVA_VERSION >= SystemUtil.JAVA_VERSION_25; // private static final Class THREAD_CLASS = Thread.class; private static final Class RUNNABLE_CLASS = Runnable.class; private static Class threadBuilderClass; @@ -220,7 +221,7 @@ public static boolean isInNativeMethod(Thread thread, boolean defaultValue) { } public static Thread getThread(Runnable task) { - return getThread(task, ALLOW_FUTURE_THREADS); + return getThread(task, ALLOW_VIRTUAL_THREADS); } @@ -243,7 +244,7 @@ public static Thread getThread(Runnable task, boolean allowVirtual) { } public static ExecutorService createExecutorService(int maxThreads) { - return createExecutorService(maxThreads, ALLOW_FUTURE_THREADS); + return createExecutorService(maxThreads, ALLOW_VIRTUAL_THREADS); } public static ExecutorService createExecutorService(int maxThreads, boolean allowVirtual) { diff --git a/core/src/main/java/lucee/runtime/util/threading/StatmentClose.java b/core/src/main/java/lucee/runtime/util/threading/StatmentClose.java index 936f322b748..3927d5d2de9 100644 --- a/core/src/main/java/lucee/runtime/util/threading/StatmentClose.java +++ b/core/src/main/java/lucee/runtime/util/threading/StatmentClose.java @@ -7,6 +7,7 @@ import lucee.runtime.db.DatasourceConnection; import lucee.runtime.db.DatasourceManagerImpl; import lucee.runtime.exp.PageException; +import lucee.runtime.thread.ThreadUtil; public final class StatmentClose implements CloserJob { @@ -29,8 +30,7 @@ public String getLablel() { @Override public void execute() throws PageException { - // TODO add virtual threads - new Thread(() -> { + ThreadUtil.getThread(() -> { try { DBUtil.closeEL(stat); manager.releaseConnection(null, dc);