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"); })