- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下代码 fragment ,使用 ScheduledExecutorService
每 3'000 毫秒运行一次检查它是否应该调用函数 onOutTimeout()
。至少这是个主意。
private void launchOutTimeoutChecker(){
Runnable check = new Runnable() {
@Override
public void run() {
float bonus = 0;
if(firstOutTime){bonus = timeout_initial_bonus;}
float temp = System.currentTimeMillis() - lastOutTime;
if(temp < timeout + bonus){
if(Debug.logKeepalivePackets){
Log.d("keepalive", "firstOutTime: "+firstOutTime+"\ntime passed: "+temp);
}
// don't timeout yet, launch new execution
launchOutTimeoutChecker(); // yey recursion?!
} else {
if(Debug.logKeepalivePackets){
Log.d("keepalive", "TIMEOUT!\nfirstOutTime: "+firstOutTime+"\ntime passed: "+temp);
}
onOutTimeout();
}
}
};
// before the first message, give a bonus of timeout_initial_bonus
long bonus = 0;
if(firstOutTime){bonus = timeout_initial_bonus;}
long time_out = bonus + timeout;
futureOut = executorOut.schedule(check, time_out, TimeUnit.MILLISECONDS);
// the task is now scheduled. after the timeout will it check whether it should actually trigger a timeout.
// the ScheduledFuture could be used to cancel this again
}
编辑:我设置 lastOutTime
的地方是在我的(可运行)类的运行方法中。 lastInTimeoutChecker
方法不打印任何内容。
@Override
public void run() {
// initialize executors that are used in launchOutTimeoutChecker and launchInTimeoutChecker
executorIn = Executors.newSingleThreadScheduledExecutor();
executorOut = Executors.newSingleThreadScheduledExecutor();
// start the timers in new threads
this.lastOutTime = System.currentTimeMillis();
launchOutTimeoutChecker();
this.lastInTime = System.currentTimeMillis();
launchInTimeoutChecker();
}
我希望每 3 秒看到一条日志消息,因为 timeout
设置为 3,实际上日志消息大约每 3 秒出现一次。 但是为什么这个输出说耗时是 0.0?
12-03 20:16:51.049 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:16:54.051 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:16:57.052 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:00.054 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:03.055 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:06.056 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:09.057 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:12.058 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:15.059 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:18.060 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:21.061 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:24.062 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:27.064 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:30.067 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:33.068 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:36.071 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:39.072 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:42.074 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: firstOutTime: false
time passed: 0.0
12-03 20:17:45.076 19578-19658/ch.ethz.inf.vs.a4.minker.einz D/keepalive: TIMEOUT!
firstOutTime: false
time passed: 131072.0
大约一分钟后,终于出现了超时消息,我本以为这是第一条日志消息。它表示耗时数总是恰好 131072
毫秒。
我完全不明白如何调试它。我做了什么:
确保只有周围类的一个实例在运行。没有太大变化(除了输出现在如您所见,而不是每条消息都被复制,但其他一切都是一样的)
确保 lastOutTime
只设置一次,就在第一次调用 launchOutTimeoutChecker()
之前,将其设置为 System.currentTimeMillis()
firstOutTime 当前始终为 false,因此该部分应该无关紧要
起初,它按预期工作。然后我在 Debug模式下运行相同的代码,这发生了。现在,当我按通常的运行时,也会出现上面的输出。
重建没有解决它
在真实设备而不是模拟器上运行它会表现出相同的行为。
CPU 使用率或内存使用率似乎没有显着变化
我的代码有什么问题?
最佳答案
毫秒尽量不要使用float
。 System.currentTimeMillis()
返回一个 long
,这可能就是给您带来麻烦的原因。
关于java - ScheduledExecutorService 行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47623046/
这是情况,代码如下 用户填写 3 个字段并按“添加”按钮 => 创建一个 ToDoBean 并将其添加到 ToDoModel(扩展 AbstractTableModel) 并使用模型中 ToDoBea
Quarkus 有一个 https://quarkus.io/guides/scheduler来安排任务。但是,我想使用 ScheduledExecutorService .这在夸克中是允许的吗?例如
我有以下代码: ScheduledExecutorService scheduledExecutor; ..... ScheduledFuture result = scheduledExecutor
我需要实现一个计划执行程序服务,该服务每隔 x 秒运行一个线程。如果线程执行时间超过 y 秒,则应中断线程执行。我尝试使用 ScheduledExecutorService 来实现该解决方案,该服务具
我正在创建一个新线程来检查文件夹中是否有新文件,然后 hibernate 一段定义的时间。 我的首选是使用 ScheduledExecutorService,但是,我找不到任何文档来说明这是否需要等待
如何让 ScheduledExecutorService 在给定时间段内以给定时间速率执行任务? 然后下面的代码将使其以 1 秒的速率执行...但是我如何限制所有这些重复的总周期 service.sc
我意识到,如果在我的可运行对象的 run 方法内部(或没有,但应该与之相关)引发异常,我 future 的所有任务都将不会运行。 所以我的问题是:我如何从这样的异常中恢复(在哪里捕获它)? 我已经尝试
我正在使用预定执行程序服务 私有(private) ScheduledExecutorService 池 = new ScheduledThreadPoolExecutor(1); 以固定速率运行可运
ScheduledExecutorService ScheduledExecutorService 是在主线程还是后台线程上运行,我经历了 documentation here 但没有找到。 任何帮助
我有一个耳朵,将作为后端耳朵部署在多个服务器上。在那个耳朵中,我需要添加 ScheduledExecutorService 以在特定时间从数据库中获取一些记录并处理它们。但我只需要处理一次,而不是在将
我有 ScheduledExecutorService,我正在尝试更新内部数据但没有结果 public void myMethod(final String myString) { myExe
我目前遇到了 ScheduledExecutorService 执行速度快于给定时间范围的问题。 scheduleAtFixedRate声明后续执行可能会延迟,但不会等待给定的时间。 GrabPutT
我正在使用 ScheduledExecutorService.scheduleWithFixedDelay() 来安排线程的定期启动。它可以工作,但线程正在 ThreadStackTrace 中累积(
我有以下代码,每 20 分钟后调用一次任务,并且工作正常。现在,在此之上,我希望它仅在 0900 到 1800 之间工作 ScheduledExecutorService scheduler = Ex
我有一个特定的任务,必须定期执行,或者根据条件仅执行一次。我正在使用以下方法: Runnable r = new Runnable() { public void run()
我有一个 ScheduledExecutorService 来获取定期执行的任务: scheduler = Executors.newScheduledThreadPool( what size? )
以下代码是从 JMenuItem 的 ActionListener 调用的。它只是启动一个 jar 文件。 ScheduledExecutorService schedulerExecutor = E
我有两个每秒运行的执行器服务。但是当我在 run 方法中插入一行代码时,其中一个会停止运行。这是我的类(class): 游戏服务器: public class GameServer implement
提出此问题的动机我正在运行一个在非常昂贵的硬件上运行的大型产品。出于测试目的而关闭它是不可能的,也不可能在生产环境中放置一个坏的 jar。我需要尽可能确保几乎确保我不会弄乱生产环境。 在暂存设置上运行
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我是一名优秀的程序员,十分优秀!