Android 为什么ScheduledExecutorService.schedule(Runnable r、Long delay、TimeUnit t)会忽略延迟并立即运行?
我有一个ScheduledExecutorService,我想用它来计划一个具有一定延迟的Runnable的执行。然而,当我调用它的schedule方法时,延迟被完全忽略,Runnable被立即执行。这是我的代码: 我的ScheduledExecutorService构造函数:Android 为什么ScheduledExecutorService.schedule(Runnable r、Long delay、TimeUnit t)会忽略延迟并立即运行?,android,scheduledexecutorservice,Android,Scheduledexecutorservice,我有一个ScheduledExecutorService,我想用它来计划一个具有一定延迟的Runnable的执行。然而,当我调用它的schedule方法时,延迟被完全忽略,Runnable被立即执行。这是我的代码: 我的ScheduledExecutorService构造函数: private static ScheduledExecutorService existQueuePool = Executors.newScheduledThreadPool(1); 这是对其调度方法的调用
private static ScheduledExecutorService existQueuePool = Executors.newScheduledThreadPool(1);
这是对其调度方法的调用(由日志包围):
Log.d(标记“计划前”);
ScheduledFuture msScheduledFuture=existQueuePool.schedule(新的可运行(){
@凌驾
公开募捐{
d(标记“为existQueuePool中的现有消息设置clearMessageTask”);
clearMessageTask(mContext.getString(R.string.existType));
}
},1000L,时间单位为毫秒);
日志d(标签“计划表后”);
日志让我看到,“计划前”和“设置清除…”之间只有20-30毫秒的延迟,而不是我预期的1000毫秒
有关计划方法的文档如下所示:
创建并执行在给定延迟后启用的一次性操作
在这种情况下,“启用”一词的确切含义是什么
任何帮助都将不胜感激
编辑:即使使用长代码(1000L),代码似乎也会立即执行
我想你是对的。尝试
1000L
,因为需要long
值,而不是int
编辑:我自己尝试过,你的代码对我有效:
package testdelay;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class TestDelay {
private static final ScheduledExecutorService existQueuePool = Executors.newScheduledThreadPool(1);
private static long start;
private static long end;
public static void main(String[] args) {
start = System.currentTimeMillis();
System.out.println("Before execution: " + start);
ScheduledFuture<?> mScheduledFuture = existQueuePool.schedule(new Runnable() {
@Override
public void run() {
end = System.currentTimeMillis();
System.out.println("Executed at: " + end);
System.out.println("Executed after delay of : " + (end - start) + " ms.");
}
}, 1000L, TimeUnit.MILLISECONDS);
}
}
它似乎是即时运行的,因为您在runnable之外记录了一条消息,而runnable在提交到服务之后立即执行。您应该将它记录在runnable中,以查看它何时运行。我的错,我传递了一个类型为
Long
的变量,但是当我发布一个简化的代码片段时,我忘记了包含1000L
。它仍然不起作用。您知道文档中“启用”的确切含义吗?
package testdelay;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class TestDelay {
private static final ScheduledExecutorService existQueuePool = Executors.newScheduledThreadPool(1);
private static long start;
private static long end;
public static void main(String[] args) {
start = System.currentTimeMillis();
System.out.println("Before execution: " + start);
ScheduledFuture<?> mScheduledFuture = existQueuePool.schedule(new Runnable() {
@Override
public void run() {
end = System.currentTimeMillis();
System.out.println("Executed at: " + end);
System.out.println("Executed after delay of : " + (end - start) + " ms.");
}
}, 1000L, TimeUnit.MILLISECONDS);
}
}
Before execution: 1386350613147
Executed at: 1386350614149
Executed after delay of : 1002 ms.