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

使用单个定时器vs多个定时器在Android中调度定时器任务

冀崇凛
2023-03-14

我想我并不完全理解计时器和TimerTask在Java和Android中是如何工作的。现在,我定义了一些定期任务,在一个计时器内安排。

我想知道我应该使用单个计时器来安排任务,还是为每个任务使用不同的计时器实例?计时器有自己的线程吗?是否在新线程中执行计划的任务?背景中发生了什么?

这些方法有什么不同?

方法1的示例代码:

private void initTasks() {
    TimerTask task1 = new MyTimerTask1();
    TimerTask task2 = new MyTimerTask2();
    TimerTask task3 = new MyTimerTask3();
    Timer timer = new Timer();
    timer.schedule(task1, 0, TASK1_PERIOD);
    timer.schedule(task2, 0, TASK2_PERIOD);
    timer.schedule(task3, 0, TASK3_PERIOD);
}

class MyTimerTask1 extends TimerTask {
    public void run() {
        //do task1
    }
}

class MyTimerTask2 extends TimerTask {
    public void run() {
        //do task2
    }
}

class MyTimerTask3 extends TimerTask {
    public void run() {
        //do task3
    }
}

方法2的示例代码:

private void initTasks() {
    MyTimerTask1 task1 = new MyTimerTask1();
    MyTimerTask2 task2 = new MyTimerTask2();
    MyTimerTask3 task3 = new MyTimerTask3();
    task1.start();
    task2.start();
    task3.start();
}

class MyTimerTask1 extends TimerTask {
    private Timer timer;

    public void run() {
        //do task1
    }

    public void start() {
        timer = new Timer();
        timer.schedule(this, 0, TASK1_PERIOD);
    }
}

class MyTimerTask2 extends TimerTask {
    private Timer timer;

    public void run() {
        //do task2
    }

    public void start() {
        timer = new Timer();
        timer.schedule(this, 0, TASK2_PERIOD);
    }
}

class MyTimerTask3 extends TimerTask {
    private Timer timer;

    public void run() {
        //do task3
    }

    public void start() {
        timer = new Timer();
        timer.schedule(this, 0, TASK3_PERIOD);
    }
}

共有1个答案

任繁
2023-03-14

第一种解决方案创建一个计时器对象;第二种是多个计时器。正如javadoc清楚地解释的那样,每个计时器都有自己的线程:

与每个计时器对象对应的是一个后台线程,用于按顺序执行计时器的所有任务。计时器任务应该很快完成。如果计时器任务花费过多时间来完成,它会“占用”计时器的任务执行线程。这反过来会延迟后续任务的执行,当(如果)有问题的任务最终完成时,这些任务可能会“聚集”并快速连续执行。

因此:第二种解决方案保证三个任务有三个线程。换句话说:您使用了更多的资源,但这样做的结果是,您可以确保不同的任务不会相互“阻塞”(当两个任务需要在同一个线程上运行时,那么:它只是一个线程;它不能并行执行两个任务!)

但除此之外:当我阅读了一个简单的搜索“java timer android”显示的许多答案时,真正的答案似乎是:在android上,你应该更喜欢使用处理程序而不是计时器对象。

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

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

  • 但是我不能在一个计时器中处理不同的“计时器任务”。我试图将计时器任务对象添加到构造函数中,但是当我将新的计时器任务(RemindTask1)对象作为参数(内部类的实例)传递时,出现编译错误。 以下是它如何处理一项任务: 但是我完全被多个任务应该如何创建然后运行所困扰。 但是这不起作用,我不知道出了什么问题。当我将新的RemindTask2()作为参数传递时,我遇到了编译错误。

  • Running Events With a Delay # sched_basic.py import sched import time scheduler = sched.scheduler(time.time, time.sleep) def print_event(name, start): now = time.time() elapsed = int(now -

  • 我已经使用java创建了特定于时区的计划任务事件。我的密码是贝娄。 但是问题是当调用这个方法时,它会很快运行这个任务。我需要每天12点在亚洲/科伦坡时区运行这项工作。那要怎么做?

  • 有时我会得到这样的输出,即上一个任务结束和下一个任务开始之间的时间小于,大约为。 它是由于某种粒度而正常还是为什么会发生?这个delta值有什么保证吗?