From 73a1caaf465a13daf7bb6271a73b00c4046fd540 Mon Sep 17 00:00:00 2001 From: LamGC Date: Thu, 9 Jul 2020 22:17:09 +0800 Subject: [PATCH] =?UTF-8?q?[Fix=20#21]=20=E4=BF=AE=E5=A4=8D=E4=BA=86Random?= =?UTF-8?q?IntervalSendTimer=E5=9C=A8=E9=AB=98=E7=89=88=E6=9C=ACJava?= =?UTF-8?q?=E4=B8=AD=E5=9B=A0=E9=9D=9E=E6=B3=95=E5=8F=8D=E5=B0=84=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=BA=94=E7=94=A8=E5=BC=82=E5=B8=B8=E7=BB=88=E6=AD=A2?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cgj/bot/RandomIntervalSendTimer.java | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/lamgc/cgj/bot/RandomIntervalSendTimer.java b/src/main/java/net/lamgc/cgj/bot/RandomIntervalSendTimer.java index ce693ab..229e426 100644 --- a/src/main/java/net/lamgc/cgj/bot/RandomIntervalSendTimer.java +++ b/src/main/java/net/lamgc/cgj/bot/RandomIntervalSendTimer.java @@ -4,7 +4,6 @@ import com.google.common.base.Throwables; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -23,7 +22,7 @@ public class RandomIntervalSendTimer extends TimerTask { private final long time; private final int floatTime; private final AtomicBoolean loop = new AtomicBoolean(); - private final AtomicBoolean start = new AtomicBoolean(); + private final AtomicBoolean running = new AtomicBoolean(); private final String hashId = Integer.toHexString(this.hashCode()); @@ -88,7 +87,6 @@ public class RandomIntervalSendTimer extends TimerTask { this.sender = sender; this.time = time; this.floatTime = floatTime; - timerMap.put(timerId, this); if(startNow) { start(loop); } @@ -108,21 +106,18 @@ public class RandomIntervalSendTimer extends TimerTask { Date nextDate = new Date(); nextDate.setTime(nextDate.getTime() + nextDelay); log.info("定时器 {} 下一延迟: {}ms ({})", hashId, nextDelay, nextDate); - if(start.get()) { - try { - Field state = this.getClass().getSuperclass().getDeclaredField("state"); - state.setAccessible(true); - state.setInt(this, 0); - state.setAccessible(false); - } catch (NoSuchFieldException | IllegalAccessException e) { - e.printStackTrace(); - return; - } + if(running.get()) { + reset(); + return; } - start.set(true); + running.set(true); timer.schedule(this, nextDelay); } + public void reset() { + timerMap.put(timerId, (RandomIntervalSendTimer) clone()); + } + @Override public void run() { log.info("定时器 {} 开始执行...(Sender: {}@{})", this.hashId, sender.getClass().getSimpleName(), sender.hashCode()); @@ -145,7 +140,7 @@ public class RandomIntervalSendTimer extends TimerTask { */ @Override public boolean cancel() { - start.set(false); + running.set(false); loop.set(false); return super.cancel(); } @@ -158,4 +153,18 @@ public class RandomIntervalSendTimer extends TimerTask { timerMap.remove(this.timerId); } + /** + * 克隆一个参数完全一样的TimerTask对象. + * @return 返回对象不同, 参数相同的TimerTask对象. + */ + @Override + @SuppressWarnings("MethodDoesntCallSuperMethod") + public Object clone() { + RandomIntervalSendTimer newTimerTask = new RandomIntervalSendTimer( + this.timerId, this.sender, + time, floatTime, + running.get(), loop.get()); + this.destroy(); + return newTimerTask; + } }