From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: nostalfinals Date: Tue, 12 Mar 2024 00:36:29 +0800 Subject: [PATCH] Ability to use Virtual Thread for async scheduler diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java index ee166ad76bd2c143e04e4bf6bd9991bc90ab99a5..13f3f8628143ffc22a2d2c2129ea4836b0a679d7 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -385,7 +385,6 @@ public class Main { tryPreloadClass("org.bukkit.craftbukkit.scheduler.CraftScheduler$1"); tryPreloadClass("org.bukkit.craftbukkit.scheduler.CraftScheduler$2"); tryPreloadClass("org.bukkit.craftbukkit.scheduler.CraftScheduler$3"); - tryPreloadClass("org.bukkit.craftbukkit.scheduler.CraftScheduler$4"); tryPreloadClass("org.slf4j.helpers.MessageFormatter"); tryPreloadClass("org.slf4j.helpers.FormattingTuple"); tryPreloadClass("org.slf4j.helpers.BasicMarker"); diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java index 9c1aff17aabd062640e3f451a2ef8c50a7c62f10..fe45b0a4a6846662a1935bcddac791b45f09bf21 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java +++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java @@ -25,30 +25,50 @@ package org.bukkit.craftbukkit.scheduler; import com.destroystokyo.paper.ServerSchedulerReportingWrapper; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.galemc.gale.virtualthread.VirtualThreadService; import org.bukkit.plugin.Plugin; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class CraftAsyncScheduler extends CraftScheduler { - private final ThreadPoolExecutor executor = new ThreadPoolExecutor( - 4, Integer.MAX_VALUE,30L, TimeUnit.SECONDS, new SynchronousQueue<>(), - new ThreadFactoryBuilder().setNameFormat("Craft Scheduler Thread - %1$d").setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(net.minecraft.server.MinecraftServer.LOGGER)).build()); // Paper + private Executor executor; // Leaf - use super class private final Executor management = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder() .setNameFormat("Craft Async Scheduler Management Thread").setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(net.minecraft.server.MinecraftServer.LOGGER)).build()); // Paper private final List temp = new ArrayList<>(); CraftAsyncScheduler() { super(true); - executor.allowCoreThreadTimeOut(true); - executor.prestartAllCoreThreads(); + + // Leaf start - Ability to use Virtual Thread for async scheduler + if (VirtualThreadService.getJavaMajorVersion() >= VirtualThreadService.minimumJavaMajorVersionWithoutFeaturePreview && org.dreeam.leaf.config.modules.opt.VT4BukkitScheduler.enabled) { + try { + Method newThreadPerTaskExecutor = Executors.class.getMethod("newThreadPerTaskExecutor", ThreadFactory.class); + executor = (Executor) newThreadPerTaskExecutor.invoke(null, VirtualThreadService.get().createFactory()); + //executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("Craft Scheduler Thread - %1$d").factory()); // Leaf - When Minecraft using Java21 + return; + } catch (Exception ignored) { + } + } + + executor = new ThreadPoolExecutor( + 4, Integer.MAX_VALUE, 30L, TimeUnit.SECONDS, new SynchronousQueue<>(), + new ThreadFactoryBuilder().setNameFormat("Craft Scheduler Thread - %1$d").setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(net.minecraft.server.MinecraftServer.LOGGER)).build()); + + var threadPoolExecutor = (ThreadPoolExecutor) executor; + + threadPoolExecutor.allowCoreThreadTimeOut(true); + threadPoolExecutor.prestartAllCoreThreads(); + // Leaf end } @Override diff --git a/src/main/java/org/dreeam/leaf/config/modules/opt/VT4BukkitScheduler.java b/src/main/java/org/dreeam/leaf/config/modules/opt/VT4BukkitScheduler.java new file mode 100644 index 0000000000000000000000000000000000000000..9add2256eea4de354f7e4ada10b4d0ccb32a60a1 --- /dev/null +++ b/src/main/java/org/dreeam/leaf/config/modules/opt/VT4BukkitScheduler.java @@ -0,0 +1,29 @@ +package org.dreeam.leaf.config.modules.opt; + +import com.electronwill.nightconfig.core.file.CommentedFileConfig; +import org.dreeam.leaf.config.ConfigInfo; +import org.dreeam.leaf.config.EnumConfigCategory; +import org.dreeam.leaf.config.IConfigModule; + +public class VT4BukkitScheduler implements IConfigModule { + + @Override + public EnumConfigCategory getCategory() { + return EnumConfigCategory.PERFORMANCE; + } + + @Override + public String getBaseName() { + return "use_virtual_thread_for_async_scheduler"; + } + + @ConfigInfo(baseName = "enabled") + public static boolean enabled = false; + + @Override + public void onLoaded(CommentedFileConfig config) { + config.setComment("performance.use_virtual_thread_for_async_scheduler", """ + Use the new Virtual Thread introduced in JDK 21 for CraftAsyncScheduler. + """); + } +}