Merge pull request #203 from weihubeats/performance_optimization

优化性能
pull/208/head
龙台 Long Tai 2 years ago committed by GitHub
commit 5ca6e50647
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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,53 @@
package cn.hippo4j.core.toolkit;
import java.util.concurrent.ScheduledThreadPoolExecutor;
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 final String THREAD_NAME ="system.clock";
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() {
ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1, r -> {
Thread thread = new Thread(r, THREAD_NAME);
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