在Android中安排TimerTasks,使用单个定时器还是多个定时器?

8
我认为我并不完全理解Java和Android中的定时器(Timer)和定时任务(TimerTask)是如何工作的。现在,我定义了许多周期性任务,并安排在定时器内。
我想知道是否应该使用单个定时器来安排任务,或者为每个任务使用不同的定时器实例是否可以?定时器是否有自己的线程?计划任务是否在新线程中执行?背后发生了什么?
这些方法之间的区别是什么? 方法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
我注意到您还没有接受任何答案。请考虑在某个时候这样做。 - GhostCat
1个回答

18
第一种解决方案创建一个计时器对象;第二种解决方案创建多个计时器。正如 javadoc 明确解释的那样,每个计时器都有自己的线程:
每个 Timer 对象对应一个后台线程,用于按顺序执行该计时器的所有任务。计时器任务应尽快完成。如果计时器任务花费过多时间来完成,它会“占用”计时器的任务执行线程。这反过来可能会延迟后续任务的执行,当(并且如果)有问题的任务最终完成时,这些任务可能会“批量”执行。
因此:第二种解决方案保证为三个任务提供三个线程。换句话说:您使用更多资源,但由于这样做,您可以确保您的不同任务不会“阻塞”彼此(当两个任务需要在同一个线程上运行时,好吧:它只是一个线程;它无法并行执行两个任务!)

除此之外:当我阅读关于“java timer android”的简单搜索结果时,许多答案表明,在Android上,你应该优先使用Handler而不是计时器对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接