优化性能

pull/203/head
weihu 2 years ago
parent 105a957d24
commit 765581fee2

@ -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<Long> startTime = new ThreadLocal();
private final ThreadLocal<Long> 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) {

@ -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) + "";
// 峰值负载

@ -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();
}
}
Loading…
Cancel
Save