From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: nostalfinals Date: Tue, 12 Mar 2024 00:36:29 +0800 Subject: [PATCH] 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 fa843d5b5ac9e0fe8886a95246a999ac02aacd6f..b547c95d50ade495940c146ec5c39e4ef7d1d79e 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -387,7 +387,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 3c1992e212a6d6f1db4d5b807b38d71913619fc0..fe4f1868a5baebceb9ad0520f059ac8c4a68d397 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java +++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java @@ -38,17 +38,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").build()); + private final org.apache.logging.log4j.Logger LOGGER = org.apache.logging.log4j.LogManager.getLogger(getClass().getName()); // Leaf - Class logger + private final Executor executor; // Leaf - use super class private final Executor management = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder() .setNameFormat("Craft Async Scheduler Management Thread").build()); 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 (org.dreeam.leaf.config.modules.opt.VT4BukkitScheduler.enabled) { + executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("Craft Scheduler Thread - ", 0).factory()); + return; + } + + 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 - Ability to use Virtual Thread for async scheduler } @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..0c6b4555c615bd918fc8c0a597b31b7f9f05f629 --- /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 = true; + + @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. + """); + } +}