From 6883944e81c13e2e768b83e8e2ac855351200340 Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Sat, 26 Jun 2021 12:30:22 +0800 Subject: [PATCH] =?UTF-8?q?perf[scheduler]:=20=E8=B0=83=E6=95=B4=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduler/manager/SchedulerManager.java | 36 ++++-------------- .../manager/SchedulerThreadFactory.java | 37 +++++++++++++++++++ 2 files changed, 45 insertions(+), 28 deletions(-) create mode 100644 scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerThreadFactory.java diff --git a/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerManager.java b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerManager.java index 39d069e6..730cdba5 100644 --- a/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerManager.java +++ b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerManager.java @@ -21,15 +21,16 @@ import com.zfoo.scheduler.SchedulerContext; import com.zfoo.scheduler.model.anno.Scheduler; import com.zfoo.scheduler.model.vo.SchedulerDefinition; import com.zfoo.scheduler.util.TimeUtils; -import io.netty.util.concurrent.FastThreadLocalThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Modifier; import java.util.Comparator; import java.util.List; -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * @author jaysunxiao @@ -56,33 +57,12 @@ public class SchedulerManager implements ISchedulerManager { private static final long TRIGGER_MILLIS_INTERVAL = TimeUtils.MILLIS_PER_SECOND; - private static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(new SchedulerThreadFactory()); + /** + * scheduler默认只有一个单线程线程池 + */ + private static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(new SchedulerThreadFactory(1)); - private static class SchedulerThreadFactory implements ThreadFactory { - private static final AtomicInteger poolNumber = new AtomicInteger(1); - private final ThreadGroup group; - private final AtomicInteger threadNumber = new AtomicInteger(1); - private final String namePrefix; - - // scheduler-p1-t1 = scheduler-pool-1-thread-1 - SchedulerThreadFactory() { - var s = System.getSecurityManager(); - group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); - namePrefix = "scheduler-p" + poolNumber.getAndIncrement() + "-t"; - } - - @Override - public Thread newThread(Runnable runnable) { - var t = new FastThreadLocalThread(group, runnable, namePrefix + threadNumber.getAndIncrement(), 0); - t.setDaemon(false); - t.setPriority(Thread.NORM_PRIORITY); - t.setUncaughtExceptionHandler((thread, e) -> { - logger.error(thread.toString(), e); - }); - return t; - } - } static { executor.scheduleAtFixedRate(() -> { diff --git a/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerThreadFactory.java b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerThreadFactory.java new file mode 100644 index 00000000..30b3ccc9 --- /dev/null +++ b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerThreadFactory.java @@ -0,0 +1,37 @@ +package com.zfoo.scheduler.manager; + +import io.netty.util.concurrent.FastThreadLocalThread; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author jaysunxiao + * @version 3.0 + */ +public class SchedulerThreadFactory implements ThreadFactory { + + private static final Logger logger = LoggerFactory.getLogger(SchedulerThreadFactory.class); + + private final ThreadGroup group; + private final AtomicInteger threadNumber = new AtomicInteger(1); + private final String namePrefix; + + public SchedulerThreadFactory(int poolNumber) { + var s = System.getSecurityManager(); + group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); + namePrefix = "scheduler-p" + poolNumber + "-t"; + } + + @Override + public Thread newThread(Runnable runnable) { + var t = new FastThreadLocalThread(group, runnable, namePrefix + threadNumber.getAndIncrement(), 0); + t.setDaemon(false); + t.setPriority(Thread.NORM_PRIORITY); + t.setUncaughtExceptionHandler((thread, e) -> logger.error(thread.toString(), e)); + return t; + } + +}