我有一个ScheduledExecutorService,我想用它来计划一个具有一定延迟的Runnable的执行。然而,当我调用它的schedule方法时,延迟被完全忽略,Runnable被立即执行。这是我的代码:
我的SchduledExecutorService构造函数:
private static ScheduledExecutorService existQueuePool = Executors.newScheduledThreadPool(1);
这是对其调度方法的调用(由日志包围):
Log.d(TAG,"Before schedule");
ScheduledFuture<?> mScheduledFuture = existQueuePool.schedule(new Runnable() {
@Override
public void run() {
Log.d(TAG,"Setting clearMessageTask for exist messages in the existQueuePool.");
clearMessageTask(mContext.getString(R.string.existType));
}
}, 1000L, TimeUnit.MILLISECONDS);
Log.d(TAG,"After schedule");
日志允许我看到,“计划前”和“设置清除…”之间只有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);
}
}
输出:
Before execution: 1386350613147
Executed at: 1386350614149
Executed after delay of : 1002 ms.
它似乎是即时运行的,因为您在runnable之外记录了一条消息,而runnable在提交到服务之后立即执行。您应该将它记录在runnable中,以查看它何时运行。
问题内容: 假设我有一个任务要从java.util.concurrent.BlockingQueue中提取元素并进行处理。 如果可以动态更改频率,我该如何安排/重新安排任务? 想法是获取数据更新流并将其批量传播到GUI 用户应该能够更改更新频率 问题答案: 我认为您无法更改固定速率的延迟。我认为您需要使用schedule()执行一次操作,并在完成后再次计划(如果需要,可以更改超时)。
问题内容: 我想知道一段时间后如何调用函数。我已经尝试过time.sleep(),但是这会暂停整个脚本。我希望脚本继续进行,但是??? secs之后调用一个函数并同时运行其他脚本 问题答案: 看一看。它在新线程中运行您的函数。
问题内容: 关于延期,Effective Go 声明以下内容: 延迟函数(如果函数是方法,则包括接收方)的参数在 延迟 执行时而不是在 调用 执行时进行评估。除了避免担心函数执行时变量会更改值外,这还意味着单个延迟的调用站点可以延迟多个函数的执行。这是一个愚蠢的例子。 延迟函数以LIFO顺序执行,因此该函数返回时将导致打印此代码。 这个例子使我感到困惑。如果在执行defer调用时评估了参数,则应该
我正在使用Java SDK在HarmonyOS中创建一个自定义组件,在那里我必须在组件实例延迟后执行一些任务。 在Android中,我们在View类中有方法。因此,我们可以实现以下要求 但是,在HMOS java SDK中,我看到组件类中没有任何可用于延迟的api。 所以,我的问题是 harmonyos中view.postdelayed(可运行的操作,长延迟)的等价物是什么?
问题内容: 我试图在收到请求后立即发送页面响应,然后进行处理,但是我发现响应即使按代码顺序排列也没有“首先”发送。在现实生活中,我有一个页面可供上传一个Excel工作表,该工作表保存到数据库中需要花费时间(50000+行),并且希望更新用户进度。这是一个简化的示例;(取决于您有多少RAM,您可能需要添加几个零来计数才能看到结果) 问题答案: HTTP协议的原始概念是一个简单的请求- 响应服务器-客
我正在用一个简单的模型测试卡桑德拉的性能。 我使用pycassa,get/xget函数()获取行键的100列。但在服务器上读取延迟约为15毫秒。 nodetool cfstats 这种类型的延迟是惊人的!当nodetool信息显示读取直接命中行缓存时。 谁能告诉我为什么cassandra在读取行缓存时要花这么多时间?