本质上,我有一个ongildmessagereceived方法,用于侦听命令警报,用户可以使用该方法设置倒计时以用消息通知他。他们输入一个时间量和最终的报警信息,并在该时间之后收到ping。
我的问题是,如何使此功能分别适用于每个用户,以便其他用户不会覆盖以前已经计时的报警时间?
在主代码中调用此方法以开始倒计时。
public void StartTimer(int seconds, GuildMessageReceivedEvent event)
{
timer = new Timer();
timer.schedule(new TimerReminder(event), seconds * 1000);
}
public void StartTimer(int seconds, GuildMessageReceivedEvent event, String text)
{
timer = new Timer();
timer.schedule(new TimerReminder(event, text), seconds * 1000);
}
我有一个子类,它在.schedule()时间之后执行一段代码。
class TimerReminder extends TimerTask{
GuildMessageReceivedEvent eventtrigger;
String alarmText = "";
private TimerReminder(GuildMessageReceivedEvent event)
{
eventtrigger=event;
}
private TimerReminder(GuildMessageReceivedEvent event, String alarmArg)
{
eventtrigger=event;
alarmText=alarmArg;
}
public void run()
{
if(alarmText.isEmpty())
{
eventtrigger.getChannel().sendMessage("<@"+auth+">,***your alarm is ringing!***????").queue();
timer.cancel(); // Terminate the timer thread
}
else
{
eventtrigger.getChannel().sendMessage("<@"+auth+">:\n"+alarmText).queue();
timer.cancel(); // Terminate the timer thread
alarmText="";
}
}
}
1条答案
按热度按时间qni6mghb1#
在每个任务结束时,您将在
timer
引用,它取消的不是当前正在运行的计时器(除非没有其他人运行该命令),而是当前分配给timer
参考,使它看起来像定时器是相互覆盖。即使您保留了对所有计时器的引用以便可以取消它们,也不需要在任务完成后取消计时器,计时器会自动终止。
此外,您不需要保持对当前正在运行的计时器的静态引用,也不需要保持对它们的引用。创建计时器时,后台线程会保留对计时器和任务的引用,这样它们就不会被垃圾收集。最好在命令运行时将计时器创建为局部变量,并对计时器进行调度,仅此而已。如果你想通过一个不同的命令或任何你想取消计时器的功能,那么你应该保留一个列表或Map,其中包含所有当前计时器的引用,这样你就可以在需要时取消它们。