From 4a843f885e299af239dc89d0a7c868ca308cd63a Mon Sep 17 00:00:00 2001 From: SerLiunx-ctrl <17689543@qq.com> Date: Mon, 17 Feb 2025 12:45:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=8A=B6=E6=80=81=E6=9C=BA=E5=86=85?= =?UTF-8?q?=E7=BD=AE=E9=BB=98=E8=AE=A4=E7=94=A8=E4=BA=8E=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E4=BA=8B=E4=BB=B6=E7=9A=84=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../machine/StateMachineContext.java | 13 +++++++++- .../support/ExecutorUtils.java | 20 ++++++++++++++ .../support/NamedThreadFactory.java | 26 +++++++++++++++++++ .../serliunx/statemanagement/MachineTest.java | 3 +-- 4 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/serliunx/statemanagement/support/NamedThreadFactory.java diff --git a/src/main/java/com/serliunx/statemanagement/machine/StateMachineContext.java b/src/main/java/com/serliunx/statemanagement/machine/StateMachineContext.java index 6d38cd4..e9e2420 100644 --- a/src/main/java/com/serliunx/statemanagement/machine/StateMachineContext.java +++ b/src/main/java/com/serliunx/statemanagement/machine/StateMachineContext.java @@ -1,6 +1,7 @@ package com.serliunx.statemanagement.machine; import com.serliunx.statemanagement.machine.handler.StateHandlerWrapper; +import com.serliunx.statemanagement.support.ExecutorUtils; import java.util.List; import java.util.Map; @@ -51,8 +52,18 @@ public final class StateMachineContext { this.entryHandlers = entryHandlers; this.leaveHandlers = leaveHandlers; this.exchangeHandlers = exchangeHandlers; - this.executor = executor; + this.executor = executorAutoConfiguration(executor); this.async = async; this.eventRegistries = eventRegistries; } + + /** + * 执行器为空时自动创建一个适合当前操作系统的执行器(线程池) + */ + private Executor executorAutoConfiguration(Executor source) { + if (source == null) { + return ExecutorUtils.adaptiveThreadPool(); + } + return source; + } } diff --git a/src/main/java/com/serliunx/statemanagement/support/ExecutorUtils.java b/src/main/java/com/serliunx/statemanagement/support/ExecutorUtils.java index 02623aa..ad2e616 100644 --- a/src/main/java/com/serliunx/statemanagement/support/ExecutorUtils.java +++ b/src/main/java/com/serliunx/statemanagement/support/ExecutorUtils.java @@ -1,6 +1,13 @@ package com.serliunx.statemanagement.support; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + /** + * 线程池相关工具类 + * * @author SerLiunx * @version 1.0.0 * @since 2024/12/28 @@ -8,4 +15,17 @@ package com.serliunx.statemanagement.support; public final class ExecutorUtils { private ExecutorUtils() {throw new UnsupportedOperationException();} + + /** + * 快速获取自适应参数的线程池 + *
  • 核心线程数量为当前处理器数量的两倍; 最大线程数量为当前处理器数量的四倍. + * + * @return 执行器(线程池) + */ + public static Executor adaptiveThreadPool() { + final int processors = Runtime.getRuntime().availableProcessors(); + return new ThreadPoolExecutor(processors * 2, processors * 4, 5, + TimeUnit.MINUTES, new ArrayBlockingQueue<>(processors * 8), new NamedThreadFactory("state-process-%s")); + } + } diff --git a/src/main/java/com/serliunx/statemanagement/support/NamedThreadFactory.java b/src/main/java/com/serliunx/statemanagement/support/NamedThreadFactory.java new file mode 100644 index 0000000..7b12e7d --- /dev/null +++ b/src/main/java/com/serliunx/statemanagement/support/NamedThreadFactory.java @@ -0,0 +1,26 @@ +package com.serliunx.statemanagement.support; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 模板名称线程池 + * + * @author SerLiunx + * @since 2025/2/17 + */ +public final class NamedThreadFactory implements ThreadFactory { + + private final AtomicInteger threadNumber = new AtomicInteger(0); + + private final String namePattern; + + public NamedThreadFactory(String namePattern) { + this.namePattern = namePattern; + } + + @Override + public Thread newThread(Runnable r) { + return new Thread(r, String.format(namePattern, threadNumber.getAndIncrement())); + } +} diff --git a/src/test/java/com/serliunx/statemanagement/MachineTest.java b/src/test/java/com/serliunx/statemanagement/MachineTest.java index cc44fa7..170bb47 100644 --- a/src/test/java/com/serliunx/statemanagement/MachineTest.java +++ b/src/test/java/com/serliunx/statemanagement/MachineTest.java @@ -21,9 +21,8 @@ public class MachineTest { @Test public void testStandardStateMachine() throws Exception { StateMachine stateMachine = StateMachineBuilder.from(PrinterState.values()) - .async(false) + .async(true) .standard() - .executor(Executors.newFixedThreadPool(16)) .whenLeave(PrinterState.IDLE, h -> { System.out.println(Thread.currentThread().getName() + ": leave IDLE"); })