我想我不完全了解Timer和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);
    }
}

最佳答案

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


与每个Timer对象相对应的是一个单独的后台线程,该线程用于依次执行所有Timer的任务。计时器任务应快速完成。如果计时器任务花费过多时间来完成,它将“占用”计时器的任务执行线程。反过来,这可能会延迟后续任务的执行,这可能会“累加”并在(如果有问题的)任务最终完成时快速连续执行。


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

除此之外,当我阅读许多关于“ java timer android”的简单搜索显示的答案时,真正的答案似乎是:在Android上,您应该更喜欢使用Handler而不是Timer对象。

07-26 09:27