当前位置: 首页 > 知识库问答 >
问题:

为什么ScheduledExecutorService。计划(可运行r、长延迟、时间单位t)忽略延迟并立即运行?

宗政霄
2023-03-14

我有一个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),代码似乎也会立即执行

共有1个答案

端木高卓
2023-03-14

我认为你做得对。尝试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在读取行缓存时要花这么多时间?