diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/DynamicThreadPoolExecutor.java b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/DynamicThreadPoolExecutor.java index 4f001993..9056c877 100644 --- a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/DynamicThreadPoolExecutor.java +++ b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/DynamicThreadPoolExecutor.java @@ -3,6 +3,7 @@ package cn.hippo4j.core.executor; import cn.hippo4j.common.config.ApplicationContextHolder; import cn.hippo4j.core.executor.support.AbstractDynamicExecutorSupport; import cn.hippo4j.core.proxy.RejectedProxyUtil; +import cn.hippo4j.core.toolkit.SystemClock; import lombok.Getter; import lombok.NonNull; import lombok.Setter; @@ -37,7 +38,7 @@ public class DynamicThreadPoolExecutor extends AbstractDynamicExecutorSupport { @Getter private final AtomicLong rejectCount = new AtomicLong(); - private final ThreadLocal startTime = new ThreadLocal(); + private final ThreadLocal startTime = new ThreadLocal<>(); public DynamicThreadPoolExecutor(int corePoolSize, int maximumPoolSize, @@ -77,7 +78,7 @@ public class DynamicThreadPoolExecutor extends AbstractDynamicExecutorSupport { return; } - this.startTime.set(System.currentTimeMillis()); + this.startTime.set(SystemClock.now()); } @Override @@ -88,7 +89,7 @@ public class DynamicThreadPoolExecutor extends AbstractDynamicExecutorSupport { try { long startTime = this.startTime.get(); - long endTime = System.currentTimeMillis(); + long endTime = SystemClock.now(); long executeTime; boolean executeTimeAlarm = (executeTime = (endTime - startTime)) > executeTimeOut; if (executeTimeAlarm && ApplicationContextHolder.getInstance() != null) { diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/web/UndertowWebThreadPoolHandler.java b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/web/UndertowWebThreadPoolHandler.java index 1ee57db0..d3d41ff9 100644 --- a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/web/UndertowWebThreadPoolHandler.java +++ b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/web/UndertowWebThreadPoolHandler.java @@ -109,7 +109,7 @@ public class UndertowWebThreadPoolHandler extends AbstractWebThreadPoolService { Method getActiveCount = ReflectionUtils.findMethod(fieldObject.getClass(), "getActiveCount"); ReflectionUtils.makeAccessible(getActiveCount); int activeCount = (int) ReflectionUtils.invokeMethod(getActiveCount, fieldObject); - activeCount = (activeCount <= 0) ? 0 : activeCount; + activeCount = Math.max(activeCount, 0); // 当前负载 String currentLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + ""; // 峰值负载 diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/toolkit/SystemClock.java b/hippo4j-core/src/main/java/cn/hippo4j/core/toolkit/SystemClock.java new file mode 100644 index 00000000..96283d87 --- /dev/null +++ b/hippo4j-core/src/main/java/cn/hippo4j/core/toolkit/SystemClock.java @@ -0,0 +1,52 @@ +package cn.hippo4j.core.toolkit; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +/** + * @author : wh + * @date : 2022/4/25 17:03 + * @description: + */ +public class SystemClock { + + private final int period; + + private final AtomicLong now; + + private static class InstanceHolder { + private static final SystemClock INSTANCE = new SystemClock(1); + } + + private SystemClock(int period) { + this.period = period; + this.now = new AtomicLong(System.currentTimeMillis()); + scheduleClockUpdating(); + } + + private static SystemClock instance() { + return InstanceHolder.INSTANCE; + } + + private void scheduleClockUpdating() { + ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> { + Thread thread = new Thread(runnable, "System Clock"); + thread.setDaemon(true); + return thread; + }); + scheduler.scheduleAtFixedRate(() -> now.set(System.currentTimeMillis()), period, period, TimeUnit.MILLISECONDS); + } + + private long currentTimeMillis() { + return now.get(); + } + + /** + * 用来替换原来的System.currentTimeMillis() + */ + public static long now() { + return instance().currentTimeMillis(); + } +}