设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间01 现在时间01 缓存数据 当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

查看: 1440|回复: 2

Android 中的 Timer 和 TimerTask详解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 打卡月天数:0
  • 打卡总奖励:47
  • 最近打卡:2025-08-07 01:00:59
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
29
主题
25
精华
0
金钱
144
积分
62
注册时间
2023-10-4
最后登录
2025-8-7

发表于 2024-11-26 20:49:29 | 显示全部楼层 |阅读模式
目录


  • Timer 简介(来自Gemini)
  • 使用 Timer
  • Timer 和 TimerTask
  • 取消 Timer 任务
  • 何时使用 Timer
  • Timer在cancel后不可以重复调用
  • TimerTask 也不可以重复使用
  • 一个 Timer 可以同时计划多个 TimerTask。
  • Timer 如何管理多个任务
  • 只要Timer不cancel, 可以反复计划新的任务
1.png


Timer 简介(来自Gemini)

Timer 是 Java 中用于创建定时任务的类。它位于
  1. java.util
复制代码
包中。可以使用 Timer 来安排一次性或定期执行的任务。
每个 Timer 对象都对应一个后台线程。此线程负责从任务队列中检索任务并按计划执行它们。

使用 Timer

要使用 Timer,首先需要创建一个 Timer 对象。然后,可以使用该对象的
  1. schedule()
复制代码
方法来安排任务。
  1. schedule()
复制代码
方法有三个参数:

    1. task
    复制代码
    : 要执行的任务
    1. delay
    复制代码
    : 任务延迟时间(以毫秒为单位)
    1. period
    复制代码
    : 任务的执行周期(以毫秒为单位)
如果
  1. period
复制代码
为 0,则任务将只执行一次。如果
  1. period
复制代码
大于 0,则任务将定期重复执行。
以下是一个示例,说明如何使用 Timer 来创建一个每隔 1 秒打印“Hello, world!”消息的任务:
  1. Timer timer = new Timer();
  2. TimerTask task = new TimerTask() {
  3.     @Override
  4.     public void run() {
  5.         System.out.println("Hello, world!");
  6.     }
  7. };
  8. timer.schedule(task, 0, 1000);
复制代码
Timer 和 TimerTask
  1. TimerTask
复制代码
是一个抽象类,用于表示要由 Timer 执行的任务。
  1. TimerTask
复制代码
  1. run()
复制代码
方法将包含要执行的任务的代码。
以下是一个示例 TimerTask 类,用于在 5 秒后打印“Hello, world!”消息:
  1. class MyTimerTask extends TimerTask {
  2.     @Override
  3.     public void run() {
  4.         System.out.println("Hello, world!");
  5.     }
  6. }
复制代码
要使用 TimerTask 类,首先需要创建一个该类的子类。然后,可以将该子类的对象传递给 Timer 的
  1. schedule()
复制代码
方法。

取消 Timer 任务

可以使用 Timer 的
  1. cancel()
复制代码
方法来取消任务。
以下是一个示例,说明如何取消上例中的任务:
Java
  1. timer.cancel();
复制代码
注意事项
Timer 任务是在后台线程中执行的。这意味着它们不应执行任何可能阻塞 UI 线程的操作。Timer 任务不应该长时间运行。如果需要执行长时间运行的任务,则应使用其他方法,例如 HandlerThread。
替代方案
除了 Timer 之外,Android 还提供了一些其他用于创建定时任务的类和方法。这些包括:
  1. AlarmManager
复制代码
: 用于设置一次性或定期警报
  1. Handler
复制代码
: 用于在主线程或后台线程中排队执行任务
  1. JobScheduler
复制代码
: 用于安排在设备空闲时执行的作业

何时使用 Timer

Timer 适用于需要在后台执行简单任务的情况。例如,可以使用 Timer 来创建每隔几秒刷新一次屏幕的任务或每隔几分钟将数据同步到服务器的任务。
但是,如果需要执行更复杂的任务或需要确保任务在特定时间执行,则应使用其他方法。

Timer在cancel后不可以重复调用

在timer调用了cancel后, 再次schedule报错:
  1. Process: com.android.sdktest, PID: 9264
  2. java.lang.IllegalStateException: Timer already cancelled.
  3.         at java.util.Timer.sched(Timer.java:404)
  4.         at java.util.Timer.schedule(Timer.java:255)
  5.         at com.android.sdktester.cases.TimerTester.start(TimerTester.java:24)
  6.         at com.android.sdktester.MainActivity.onClick(MainActivity.java:23)
  7.         at android.view.View.performClick(View.java:7322)
  8.         at android.view.View.performClickInternal(View.java:7296)
  9.         at android.view.View.access$3600(View.java:839)
  10.         at android.view.View$PerformClick.run(View.java:28319)
  11.         at android.os.Handler.handleCallback(Handler.java:900)
  12.         at android.os.Handler.dispatchMessage(Handler.java:103)
  13.         at android.os.Looper.loop(Looper.java:219)
  14.         at android.app.ActivityThread.main(ActivityThread.java:8673)
  15.         at java.lang.reflect.Method.invoke(Native Method)
  16.         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
  17.         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)
复制代码
在 Android 中,Timer 类用于创建定时任务。Timer 的
  1. cancel()
复制代码
方法可以取消所有已安排的任务并停止 Timer 线程。一旦 Timer 线程被取消,就不能再重新启动。
Timer 线程是一个后台线程。当 Timer 任务被取消时,Timer 线程将被终止。这意味着 Timer 线程不再能够执行任何新的任务。
如果尝试在取消 Timer 线程后重新启动它,则会抛出
  1. **IllegalStateException**
复制代码
异常。
解决这个问题需要创建一个新的 Timer 对象并使用新的
  1. schedule()
复制代码
方法安排新的任务。

TimerTask 也不可以重复使用

TimerTask 类用于表示要由 Timer 执行的任务。TimerTask 的
  1. run()
复制代码
方法将包含要执行的任务的代码。
原因
TimerTask 类不是线程安全的。这意味着如果同一个 TimerTask 对象被多个 Timer 任务使用,则可能导致数据竞争和其他问题。
  1. Timer.java
复制代码
  1.     private void sched(TimerTask task, long time, long period) {
  2.         if (time < 0)
  3.             throw new IllegalArgumentException("Illegal execution time.");
  4.         // Constrain value of period sufficiently to prevent numeric
  5.         // overflow while still being effectively infinitely large.
  6.         if (Math.abs(period) > (Long.MAX_VALUE >> 1))
  7.             period >>= 1;
  8.         synchronized(queue) {
  9.             if (!thread.newTasksMayBeScheduled)
  10.                 throw new IllegalStateException("Timer already cancelled.");
  11.             synchronized(task.lock) {
  12.                 **if (task.state != TimerTask.VIRGIN)**
  13.                     throw new IllegalStateException(
  14.                         "Task already scheduled or cancelled");
  15.                 task.nextExecutionTime = time;
  16.                 task.period = period;
  17.                 task.state = TimerTask.SCHEDULED;
  18.             }
  19.             queue.add(task);
  20.             if (queue.getMin() == task)
  21.                 queue.notify();
  22.         }
  23.     }
复制代码
  1. TimerTask.java
复制代码
  1.     public boolean cancel() {
  2.         synchronized(lock) {
  3.             boolean result = (state == SCHEDULED);
  4.             state = CANCELLED;
  5.             return result;
  6.         }
  7.     }
复制代码
为了避免这些问题,应为每个 Timer 任务创建一个新的 TimerTask 对象

一个 Timer 可以同时计划多个 TimerTask。

Timer 类用于创建定时任务。Timer 的
  1. schedule()
复制代码
方法可以安排一个或多个任务。
以下是一个示例,说明如何使用
  1. schedule()
复制代码
方法安排多个任务:
  1. Timer timer = new Timer();
  2. TimerTask task1 = new TimerTask() {
  3.     @Override
  4.     public void run() {
  5.         System.out.println("Task 1");
  6.     }
  7. };
  8. TimerTask task2 = new TimerTask() {
  9.     @Override
  10.     public void run() {
  11.         System.out.println("Task 2");
  12.     }
  13. };
  14. timer.schedule(task1, 0, 1000);
  15. timer.schedule(task2, 500, 1000);
复制代码
在这个示例中,
  1. task1
复制代码
将在 0 毫秒后立即执行,然后每隔 1 秒重复执行一次。
  1. task2
复制代码
将在 500 毫秒后执行,然后每隔 1 秒重复执行一次。

Timer 如何管理多个任务

Timer 使用一个队列来存储已安排的任务。Timer 线程负责从队列中检索任务并按计划执行它们。
当 Timer 任务被安排时,它将被添加到队列的末尾。Timer 线程将从队列的头部检索任务。这意味着最先安排的任务将首先执行。
如果有多个任务在同一时间就绪,则 Timer 线程将按 FIFO(先进先出)的顺序执行它们。
注意事项

  • Timer 任务是在后台线程中执行的。这意味着它们不应执行任何可能阻塞 UI 线程的操作。
  • Timer 任务不应该长时间运行。如果需要执行长时间运行的任务,则应使用其他方法,例如 HandlerThread。

只要Timer不cancel, 可以反复计划新的任务
  1. Timer timer = new Timer();
  2. TimerTask t1, t2, t3;
  3. //省略创建TimerTask代码....
  4. {
  5.         timer.schedule(t1, 0, 1000);
  6.         timer.schedule(t2, 0, 1000;
  7.         Thread.sleep(10 * 1000);//等待10秒
  8.         t1.cancel();
  9.         t2.cancel();
  10.         Thread.sleep(5000);
  11.         timer.schedule(t3, 0, 1000;
  12.         Thread.sleep(5000);
  13.         t3.cancel();
  14. }
  15. timer.cancel()
复制代码
这段代码使用了
  1. Thread.sleep()
复制代码
方法来控制任务的执行顺序。在
  1. Thread.sleep()
复制代码
方法执行期间,Timer 线程无法从任务队列中检索任务,因此即使
  1. t1
复制代码
  1. t2
复制代码
任务已经被取消,它们也不会再被执行。使用了
  1. t1.cancel()
复制代码
  1. t2.cancel()
复制代码
方法来显式地将
  1. t1
复制代码
  1. t2
复制代码
任务从 Timer 的任务队列中删除。这可以确保这两个任务不会再次被执行.
参考
Timer定时器_的技术博客
Android 定时器Timer的使用
Android 开发Timer与TimerTask - 观心静
到此这篇关于Android 的 Timer 和 TimerTask的文章就介绍到这了,更多相关Android Timer 和 TimerTask内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
16
积分
12
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2025-11-16 08:45:46 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-28
最后登录
2022-12-28

发表于 昨天 23:33 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表