Android定时器,推荐ScheduledThreadPoolExecutor
Android定时器,推荐ScheduledThreadPoolExecutor
官方网址:http://developer.android.com/reference/java/util/Timer.html
实现定时器的功能,有如下几种方法:
1、Thread的sleep(long)方法
2、Handler的postDelayed(Runnable, long)方法
3、Timer与TimerTask结合的方法
这3种方法,本质上是一样的,都跟线程相关;这里主要讲下Timer。
定时器可以有个名称(name),也可以没有。
定时器,从线程类型的角度,可以分为如下两种:
1、普通类型;
2、后台(Deamon)类型;
Timer()---无名称,普通类型
Timer(String name)---有名称,普通类型
Timer(boolean isDaemon)---无名称,可指定类型
Timer(String name, boolean isDaemon)---有名称,可指定类型
参见:守护线程(Daemon Thread)
定时器,从执行次数的角度,可分为如下两种:
1、仅执行一次;属于这种的,有如下的两个成员函数:
schedule(TimerTask task, Date when)
schedule(TimerTask task, long delay)
2、循环执行;属于这种的,有如下的四个成员函数:
schedule(TimerTask task, Date when, long period)
schedule(TimerTask task, long delay, long period)
scheduleAtFixedRate(TimerTask task, long delay, long period)
scheduleAtFixedRate(TimerTask task, Date when, long period)
前两个,保证执行间隔是稳定的;两个,保证执行时间是稳定的。
由于定时器无法保证实时(real-time )特性;
也就是说,有可能因为某个执行太耗时,导致本该到时的定时器,得不到立即执行。
因此,当出现在这种“已经超时了,才轮到定时器执行”的情况时,就有了如下两种情况:
1、保证执行间隔是稳定的,即scheduledExecuteTime(第n+1次)=realExecuteTime(第n次)+periodTime)
2、保证执行时间是稳定的,即scheduledExecuteTime(第n+1次)=firstExecuteTime +n*periodTime
定时器,还可以取消(cancel())和清理(purge(),即清除所有已取消的)
在JDK1.5之前,定时/周期操作都是通过Timer来实现的。但是Timer有以下几种危险:
1、Timer是基于绝对时间的。容易受系统时钟的影响。
2、Timer只新建了一个线程来执行所有的TimeTask;所有TimeTask可能会受相关影响。
3、Timer不会捕获TimerTask的异常,只是简单地停止;这会影响其他TimeTask的执行。
如果使用JDK1.5以上版本,建议用ScheduledThreadPoolExecutor代替Timer。
它采用相对时间,用线程池来执行TimerTask,会处理TimerTask异常。
它基本上解决了上述的所有问题。
Android定时器,推荐ScheduledThreadPoolExecutor的更多相关文章
- [Android Pro] Android 官方推荐 : DialogFragment 创建对话框
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37815413 1. 概述 DialogFragment在android 3.0时 ...
- android Google推荐的容器SparseArrayCompat简介
android Google推荐的容器SparseArrayCompat简介 private static SparseArrayCompat<BaseFragment> mCaches ...
- 转帖:Android 官方推荐 : DialogFragment 创建对话框
转: Android 官方推荐 : DialogFragment 创建对话框 复制内容,留作备份 1. 概述 DialogFragment在android 3.0时被引入.是一种特殊的Fragment ...
- 定时器Timer&ScheduledThreadPoolExecutor
定时器Timer&ScheduledThreadPoolExecutor /** * @ClassName: TimerTest * @author: daniel.zhao * @date: ...
- Android TitleBar推荐
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/206 Android TitleBar推荐 这段时间在帮别 ...
- Android 官方推荐 : DialogFragment 创建对话框
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37815413 1. 概述 DialogFragment在android 3.0时 ...
- android 定时器AlarmManager
1.android中通常是使用AlarmManager来定时启动一个单次或重复多次操作的.具体的说就是我们通过AlarmManager设定一个时间和注册一个intent到系统中,然后在该时间到来时,系 ...
- android 定时器的实现
在Android上常用的定时器有两种,一种是Java.util.Timer,一种就是系统的AlarmService了. 实验1:使用Java.util.Timer. 在onStart()创创建Time ...
- android 定时器的使用
1.android中通常是使用AlarmManager来定时启动一个单次或重复多次操作的.具体的说就是我们通过AlarmManager设定一个时间和注册一个intent到系统中,然后在该时间到来时,系 ...
随机推荐
- 图Graph
存储结构: 1.邻接矩阵存储 typedef struct { char vex[MAXVEX];//顶点数 int arc[MAXVEX][MAXVEX];//邻接矩阵 int numVextexe ...
- DOM笔记(十):JavaScript正则表达式
一.RegExp ECMAScript通过RegExp类型类支持正则表达式,语法和Perl类似: var exp = /pattern/flags; patternb部分是任何简单的或复杂的正则表达式 ...
- MySQL安装(图文详解)
下面的是MySQL安装的图解,用的可执行文件安装的,详细说明了一下!打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行“setup.exe”,出现如下界面 my ...
- Apache Spark 架构
1.Driver:运行 Application 的 main() 函数并且创建 SparkContext. 2.Client:用户提交作业的客户端. 3.Worker:集群中任何可以运行 Applic ...
- 【多线程同步案例】Race Condition引起的性能问题
Race Condition(也叫做资源竞争),是多线程编程中比较头疼的问题.特别是Java多线程模型当中,经常会因为多个线程同时访问相同的共享数据,而造成数据的不一致性.为了解决这个问题,通常来说需 ...
- 让CSS3给你的文字加上边框宽度,并实现镂空效果
这次,我主要向大家介绍一下CSS3下的-webkit-text-stroke属性,并分享几个用该属性制作的镂空文字效果. 1.-webkit-text-stroke属性简介 CSS边框的一个不足就是只 ...
- MYSQL数据库重点:事务与锁机制
一.事务 一组连续的数据库操作,每一次操作都成功,整个事务就成功,只要有一步出错,整个事务就失败: MySQL事务与存储引擎相关 1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB: ...
- HDU 2101 A + B Problem Too 分类: ACM 2015-06-16 23:57 18人阅读 评论(0) 收藏
A + B Problem Too Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- java应用maven插件动态生成webservice代码
pom.xml如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- [转]vector iterator not incrementable 的问题
转自:http://blog.csdn.net/kuaile123/article/details/11105115 vector::erase误使用问题: 暂时使用经验: 不能在循环中使用,否则会报 ...