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

用于调度固定速率任务的处理器或定时器

冀永寿
2023-03-14

我正在开发一个应用程序,它需要每x分钟上线一次,检查一些新数据。为了防止大量的网络和数据使用,任务应该以固定的速率运行,但是这种解决方案的最佳方法是什么?< code >处理程序或< code >计时器对象?

共有3个答案

凌黎明
2023-03-14

如果您正在寻求良好的性能和更少的电池消耗,您应该考虑与< code >广播接收器集成的< code >报警管理器,它将在X时间内调用服务,让它完成工作,然后再次关闭。

但是,使用计时器处理程序,您需要让服务始终在后台运行。除非,您希望它在应用程序运行时获取数据,因此您不需要服务。

如果您的选择是handler还是timer,那么使用timer,因为它更简单,并且可以以更好的性能完成工作。handler通常用于使用RunnableMesseges更新UI。

邓鸿雪
2023-03-14

您应该像这样使用服务和警报接收器,这就是它们的用途。如果您在“活动记录”中使用计时器或任何其他机制,并且将数据设置为每“几分钟”更新一次,则用户很有可能不会出现在您的应用程序中,Android很可能会清理它,从而使您的应用程序*不更新。闹钟将一直保持打开状态,直到设备关闭。

缑泓
2023-03-14

使用定时器有一些缺点

  • 它只创建单个线程来执行任务,如果一个任务运行时间过长,其他任务就会受到影响。
  • 它不处理任务抛出的异常,线程只是终止,这会影响其他计划任务并且它们永远不会运行。

而另一方面,计划线程池演示器正确处理所有这些问题,使用计时器是没有意义的。有两种方法可能对您的情况有用

>

  • scheduleAtFixedRate(...)

    scheduleWithFixedDelay(..)

    class LongRunningTask implements Runnable {
    
      @Override
      public void run() {
        System.out.println("Hello world");
      } 
    }
    
    ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
    long period = 100; // the period between successive executions
    exec.scheduleAtFixedRate(new LongRunningTask (), 0, duration, TimeUnit.MICROSECONDS);
    long delay = 100; //the delay between the termination of one execution and the commencement of the next
    exec.scheduleWithFixedDelay(new MyTask(), 0, duration, TimeUnit.MICROSECONDS);
    

    要取消执行者,请使用此-SchduledFuture

    // schedule long running task in 2 minutes:
    ScheduledFuture scheduleFuture = exec.scheduleAtFixedRate(new MyTask(), 0, duration, TimeUnit.MICROSECONDS);
    
    ... ...
    // At some point in the future, if you want to cancel scheduled task:
    scheduleFuture.cancel(true);
    

  •  类似资料:
    • 本文向大家介绍Java中Spring使用Quartz任务调度定时器,包括了Java中Spring使用Quartz任务调度定时器的使用技巧和注意事项,需要的朋友参考一下 Quartz 任务调度是什么 Quartz 是 OpenSymphony 开源组织在 Job scheduling 领域又一个开源项目,它可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用。Quartz 是一个完全由 Ja

    • 我想我并不完全理解计时器和TimerTask在Java和Android中是如何工作的。现在,我定义了一些定期任务,在一个计时器内安排。 我想知道我应该使用单个计时器来安排任务,还是为每个任务使用不同的计时器实例?计时器有自己的线程吗?是否在新线程中执行计划的任务?背景中发生了什么? 这些方法有什么不同? 方法1的示例代码: 方法2的示例代码:

    • 所有人, 有没有一种方法,我可以使用spring调度器,改变基于一天的时间的固定费率? 对于例如:一个方法应该在10-12AM以1000ms的速率运行,然后在12AM之后切换到5000ms 还是必须用不同的cron创建多个方法?

    • 有一个基于某些条件删除文件的任务。这个任务应该每天在某个时间运行。我们是否应该为这个任务使用spring boot和调度器。或者spring批处理+调度器会很好。也可以在spring批处理中使用分区并行处理此任务。 谢谢

    • 正如标题所说,我正在尝试使用排定注释的fixedRate参数,以便每秒调用一个函数。下面是我正在使用的代码: 按照我的理解,在打印第一个“结束线程”之前,函数应该打印五次“开始线程”。 问题是函数先打印“开始线程”然后等待5.5秒,打印“结束线程”,然后走“开始线程”,以此类推……看起来调度程序在启动新的执行之前等待前一个执行完成,但fixedRate属性不应该是这种情况。 我仔细阅读了一下,发现

    • 我有一个带有两个子容器的flex-box容器,在屏幕较小的情况下,右边的容器应该折叠在左边的容器下面。然而,这似乎只在父容器宽度为100%时才起作用,而当它设置为固定宽度时则不起作用。它需要一个基于设计的固定宽度,我尝试将固定宽度的容器包装在具有100%宽度的父容器中,但这并不有效。 如何将容器设置为固定宽度,以便项目在较小屏幕尺寸下正确换行? null null JSFIDDLE链接:链接