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/scheduler/CraftAsyncScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java index 9c1aff17aabd062640e3f451a2ef8c50a7c62f10..234a92d643059e7178eeb0b4dc255bccef656851 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java +++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java @@ -26,6 +26,7 @@ package org.bukkit.craftbukkit.scheduler; import com.destroystokyo.paper.ServerSchedulerReportingWrapper; import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.bukkit.plugin.Plugin; +import org.dreeam.leaf.config.modules.opt.VT4BukkitScheduler; import java.util.ArrayList; import java.util.Iterator; @@ -38,17 +39,30 @@ 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 final 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 (!VT4BukkitScheduler.enabled) { + 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(); + + return; + } + + executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("Craft Scheduler Thread - %1$d").factory()); + // 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. + """); + } +}