当前位置: 首页 > 面试题库 >

是否有代码检查计时器是否正在运行?

汲涵育
2023-03-14
问题内容

我有一个安排计时器的游戏。我有这个CoresManager文件:

package com.rs.cores;

 import java.util.Timer;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;

 public final class CoresManager {

protected static volatile boolean shutdown;
public static WorldThread worldThread;
public static ExecutorService serverWorkerChannelExecutor;
public static ExecutorService serverBossChannelExecutor;
public static Timer fastExecutor;
public static ScheduledExecutorService slowExecutor;
public static int serverWorkersCount;

public static void init() {
    worldThread = new WorldThread();
    int availableProcessors = Runtime.getRuntime().availableProcessors();
    serverWorkersCount = availableProcessors >= 6 ? availableProcessors - (availableProcessors >= 12 ? 7 : 5) : 1;
    serverWorkerChannelExecutor = availableProcessors >= 6 ? Executors
            .newFixedThreadPool(availableProcessors - (availableProcessors >= 12 ? 7 : 5),
            new DecoderThreadFactory()) : Executors.newSingleThreadExecutor(new DecoderThreadFactory());
    serverBossChannelExecutor = Executors
            .newSingleThreadExecutor(new DecoderThreadFactory());
    fastExecutor = new Timer("Fast Executor");
    slowExecutor = availableProcessors >= 6 ? Executors.newScheduledThreadPool(availableProcessors >= 12 ? 4 : 2,
                    new SlowThreadFactory()) : Executors
            .newSingleThreadScheduledExecutor(new SlowThreadFactory());
    worldThread.start();
}

public static void shutdown() {
    serverWorkerChannelExecutor.shutdown();
    serverBossChannelExecutor.shutdown();
    fastExecutor.cancel();
    slowExecutor.shutdown();
    shutdown = true;
}

private CoresManager() {

}
}

我在游戏中使用这个:

    private void startTimer() {
    CoresManager.fastExecutor.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            if (timer == 0 || timer < 1) {
                player.sm("Your timer has ended! The NPCs will no longer spawn.");
                timer = 0;
                this.cancel();
                exitInstance(); 
                return;
            }
            timer--;
            timerchecker = true;
            seconds = timer % 60;
            player.setTimer(timer);
            minutes = TimeUnit.SECONDS.toMinutes(timer);            
        }
    }, 0, 1000);
}

如果播放器注销并且服务器重新启动,CoresManager计时器将停止运行。为了使其再次运行,我添加了代码以使其在您再次登录后再次执行startTimer()。但是,由于如果服务器未注销,计时器仍在运行,因此计时器开始运行两次。根据您注销和登录的次数,计时器开始减去2或更多。我认为,如果有代码确定计时器是否已在运行,它将解决。有没有办法做到这一点?请帮忙!


问题答案:

我没有在文档中看到任何可检查TimerTask对象状态的文档(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/TimerTask.html),选择是扩展TimerTask并创建您自己的类。除了使用匿名TimerTask之外,您还可以按照以下方式创建内容:

public class CoresTimerTask extends TimerTask {

    private boolean hasStarted = false;

    @Overrides
    public void run() {
        this.hasStarted = true;
        //rest of run logic here...
    }

    public boolean hasRunStarted() {
        return this.hasStarted;
    }
}

并仅维护对此CoresTimerTask对象的引用,然后将其传递给startTimer()。然后,您可以稍后通过hasRunStarted检查该对象。



 类似资料:
  • 我想检查Quartz作业是否正在运行。我发现它可以使用调度程序。getCurrentlyExecutingJobs()。但是我对此感到困惑,我应该把它放在哪里才能得到结果呢?谢谢

  • 问题内容: 为什么没有java.util.Timer对象的方法? 如果计时器尚未取消,我想安排一个任务,如果取消了计时器,请直接运行它(在同一线程上)。 如果计时器已被取消,捕获该错误的唯一选择是吗?(赶上感觉不对)。 问题答案: 您如何确定要使用?改为使用,它具有很多其他好处,也可以启动。从Java 5开始,一般建议是将s 替换为s。 有一个专门用于计划执行程序服务的界面。使用其中一种方法实例化

  • 问题内容: 如何检查存储过程或查询是否仍在SQL Server中运行? 主意 我曾经想过要在过程开始时在哪里写日志,并在过程结束时将日志删除。 缺陷: 使用过程监控器 我希望能有一个可以合并为一个存储过程的解决方案和/或,作为输入,所以使用SQL Server的界面将无法正常工作跟踪程序或解决方案。 更新#1 用法示例: 该过程应该像 并在运行时(20秒内)返回true,然后在函数失败或系统重新启

  • 问题内容: 我正在尝试创建一个bash实用程序脚本以检查我的服务器中是否正在运行docker守护进程。除了运行这样的代码之外,还有没有更好的方法来检查docker守护进程是否正在我的服务器中运行? 我想创建一个bash shell脚本,该脚本将检查我的docker守护程序是否正在运行。如果它正在运行,则什么也不做,如果没有,则启动docker守护程序。 我的伪代码是这样的。我正在考虑解析ps -e

  • 问题内容: 有谁知道在PHP中检查脚本是32位还是64位运行的方法?目前,我正在使用PHP 5.3.5。 理想情况下,我想编写一个函数,以便我的代码如下所示: 有人有什么想法吗? 问题答案: 检查常数。它会根据寄存器的大小(即32位和64位)而变化。 在32位系统中,应为 4 ;对于64位系统,应为 8 。

  • 我需要一个可靠的JavaScript库/函数来检查超文本标记语言片段是否有效,我可以从我的代码中调用。例如,它应该检查打开的标签和引号是否关闭,嵌套是否正确等。 我不希望验证失败,因为有些东西不是100%标准的(但无论如何都会工作)。