java - 在 Android 中使用单个计时器与多个计时器来调度 TimerTasks

标签 java android multithreading timer timertask

我认为我不完全理解 TimerTimerTask 在 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清楚地解释了,每个计时器都有自己的线程:

Corresponding to each Timer object is a single background thread that is used to execute all of the timer's tasks, sequentially. Timer tasks should complete quickly. If a timer task takes excessive time to complete, it "hogs" the timer's task execution thread. This can, in turn, delay the execution of subsequent tasks, which may "bunch up" and execute in rapid succession when (and if) the offending task finally completes.

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

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

关于java - 在 Android 中使用单个计时器与多个计时器来调度 TimerTasks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43674129/

相关文章:

Java 字符串匹配正则表达式

android - MpAndroidChart 饼图图例在底部中心切割问题

C++ 11 线程简单示例

android - onPageSelected 在调用 onCreateView 之前运行?

android - 获取带有自定义状态栏通知的默认图标背景

c - 使用 OpenMP-Tasks 的生产者-消费者

java - 为什么我只会在部署了相同耳朵的三个 Web 服务器之一上收到 ConcurrentModificationException

java - 在 Android 中存储应用程序数据的最佳方式是什么?

java - Hadoop 是一个不错的开源项目吗?

java - 如何在两个 Java Web 服务之间共享内存?