Timer与AlarmManager的差别
线程
通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可执行)状态。但此时并没有执行,它须要CPU时间片。
一旦得到CPU时间片。就会执行run()方法。
run()的方法体称为线程体,它包括了要执行的这个线程的内容,run()方法执行结束。此线程也随即终止。
线程状态转换
一、新建(new):新创建了一个线程对象。
二、可执行(runnable):线程对象创建后,其它线程(比方main线程)调用了该对象的start()方法。
该状态的线程位于可执行线程池中,等待被线程调度选中。获取cpu 的使用权
。
三、执行(running):可执行状态(runnable)的线程获得了cpu
时间片(timeslice) 。运行程序代码。
四、堵塞(block):堵塞状态是指线程由于某种原因放弃了cpu 使用权。也即让出了cpu timeslice,临时停止执行。直到线程进入可执行(runnable)状态。才有机会再次获得cpu
timeslice 转到执行(running)状态。堵塞的情况分三种:
- 等待堵塞:执行(running)的线程执行o.wait()方法。JVM会把该线程放入等待队列(waitting queue)中。
- 同步堵塞:执行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
- 其它堵塞:执行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为堵塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完成时,线程又一次转入可执行(runnable)状态。
五、死亡(dead):线程run()、main() 方法运行结束。或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。
定时器
Android 平台上经常使用的定时器主要有两个:
- Java的Timer
- Android的AlarmManager
Timer
Java的Timer类能够用来计划须要循环运行的任务。
简单的说,一个Timer内部封装装了“一个Thread”和“一个TimerTask队列”,这个队列依照一定的方式将任务排队处理。封装的Thread在Timer的构造方法调用时被启动,这个Thread的run方法依照条件去循环这个TimerTask队列,然后调用TimerTask的run方法。
可是,如果CPU进入了休眠状态,那么这个thread将会因为失去CPU时间片而堵塞。从而造成我们须要的定时任务失效。上述定时任务失效的场景分析:如果定时任务的条件是到了时间xx:yy才干运行。但因为cpu休眠造成线程堵塞的关系,当前系统时间超过了这个时间,即便CPU从终端中恢复了,那么因为条件不满足。定时任务在这一次自然就失效了。
解决方式是:它须要用WakeLock让CPU 保持唤醒状态。
那么问题就来了。这样会大量消耗手机电量,大大减短手机待机时间。这样的方式不能满足我们的需求。
注:TimerTask实现Runnable接口,但它的run方法仅仅是简单的在Timer中封装的Thread中被调用,并未将其放在其他线程中运行。也就是说timer是单线程运行的。那么问题来了,为何要这么费劲的封装一个Runnable接口又不进行多线程调用?我的答案是。老外仅仅是想要表示它是可运行的方法。
AlarmManager
AlarmManager是Android 系统封装的用于管理RTC的模块,RTC(Real Time Clock) 是一个独立的硬件时钟。能够在 CPU 休眠时正常执行,在预设的时间到达时,通过中断唤醒CPU。这意味着,假设我们用 AlarmManager 来定时执行任务,CPU 能够正常的休眠,仅仅有在须要执行任务时醒来一段非常短的时间。
Timer与AlarmManager的差别的更多相关文章
- android 定时器(Handler Timer Thread AlarmManager CountDownTimer)
Android实现定时任务一般会使用以上(Handler Timer Thread AlarmManager CountDownTimer)五种方式.当然还有很多组合使用(比如Handler+Thre ...
- android handler机制和Timer采用
Timer主要用于创建一个任务来定期运行. 创建继承Task该任务等级.即任务每次跑. private class MyTask extends TimerTask { @Override publi ...
- Android 推送实现
解决数据同步的问题:常用的方法有2种. (1) 定时去服务器上查询数据,也叫Polling. (2) 手机跟服务器之间维护一个 TCP 长连接,或者使用SMS,当服务器有数据时,实时推送到客户端,也就 ...
- Android开发之执行定时任务AlarmManager,Timer,Thread
1.Thread:使用线程方式2.Timer是java的特性3.AlarmManager:AlarmManager将应用与服务分割开来后,使得应用程序开发者不用 关心具体的服务,而是直接通过Alarm ...
- System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差别和分别什么时候用
System.Windows.Forms.Timer.System.Timers.Timer.System.Threading.Timer的 区别和用法http://space.itpub.net/1 ...
- Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...
- 使用AlarmManager定期执行工作
新建一个Service来模拟后台执行的程序,PollingService.java: package com.ryantang.rtpollingdemo; import android.app.No ...
- android AlarmManager 详解
在开发互联网应用时候,我们常常要使用心跳来保证客户端与服务器的连接.怎么完成心跳很关键,在说道客户端心跳功能时,如果使用Timer或者专门开起一个线程来做心跳的工作,会浪费CPU工作时间,而且也会更多 ...
- Android AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的用法:(1)在指定时长后执行某项操 ...
随机推荐
- Struts2 S标签 数目字格式化成金额输出(保留两位小数)
JSP: <s:property value="%{formatDouble(price)}" /> Action:添加 //格式化数字显示 public String ...
- Glusterfs初试
Gluster的模式及介绍在此不表,这里只记录安装及配置过程. 1.整体环境 server1 : gfs1.cluster.com server2 : gfs2.cluster.com Client: ...
- mac的cpu处理器个数、核数、超线程
处理器:1个 每个核的L2缓存大小:256KB L3缓存大小:3MB 核数:2个 2个核却有4个CPU:使用了超线程技术--双核四线程 macOS,查看CPU信息:sysctl machdep.cpu ...
- ING【转载】epoll总结系列
epoll的总结之一基本的参数设置 http://fpcfjf.blog.163.com/blog/static/55469793201452095738566/?suggestedreading&a ...
- rcp(插件开发) The 'Eclipse-LazyStart' header is deprecated, use 'Bundle-ActivationPolicy'
'Eclipse-LazyStart' 这个规范在3.4 osgi 4.1 以后就不支持了 大家使用Bundle-ActivationPolicy: lazy 这个属性来实现插件的懒加载吧!
- 【Node.js】初体验之安装和HelloWorld
听说Node.js是个蛮吊的东东.中午休息时间有限,暂时看了下知道怎么安装和初步使用了. 1.安装: 到Node.js官网下载就可以了,才5M多点,双击后按步骤安装就可以了. 2."Hell ...
- 一款纯css实现的垂直时间线效果
今天给大家分享一款纯css实现的垂直时间线效果.垂直时间线适合放在类似任务时间安排的网页上.该实现采用了蓝色作为主题色,界面效果还不错.一起看下效果图: 实现的代码. html代码: ... 阅读原文 ...
- 如何安装Tomcat
1 请确认已经安装了JRE或JDK并配置好了环境变量,关于如何配置环境变量,参考我的另一篇文章"WIN7如何配置java环境变量,运行环境.doc" 2 用记事本打开bin目录下的 ...
- 基于Teigha.Net实现CAD到SHP的转换方案
CAD在测绘领域运用广泛,所以,现在有很多成果都是CAD格式,但其自身存在很多局限性,需将其转为支持更加广泛,存储更加完善的 SHP文件.ArcGIS中直接提供相关转换工具,但不能转换Xdata,Ar ...
- C# 单元测试几个方法的用法
单元测试的基本方法是调用被测代码的函数,输入函数的参数值,获取返回结果,然后与预期测试结果进行比较,如果相等则认为测试通过,否则认为测试不通过. 1.Assert类的使用 Assert.Inconcl ...