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)在指定时长后执行某项操 ...
随机推荐
- Mysql/MariaDB的多主集群实现:Galera Cluster
Galera Cluster是Codership公司开发的一套免费开源的高可用方案,属于multi-master的集群架构,如图所示: 三个实例,组成了一个集群,而这三个节点与普通的主从架构不同,它们 ...
- spring中ApplicationContextAware接口使用理解
一.这个接口有什么用?当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以直 ...
- 即时通讯之smack客户端配置
之前学习了通过Openfire+spark+smack的模式来完成我们的即时通讯软件,上次我们已经完成了Openfire的安装和配置,这次我们继续完成我们的客户端部分. 1.首先我们通过百度smack ...
- JSP简单练习-定时刷新页面
<%@ page contentType="text/html; charset=gb2312" %> <%@ page import="java.ut ...
- Android 如何修改默认输入法
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- Oracle服务启动顺序导致ORA-12514
在window 上装了oracle11g,按照常规步骤安装完成后一切OK,如下图所示 C:\Users\Administrator>sqlplus /nolog SQL*Plus: Releas ...
- leetcode第一刷_ Flatten Binary Tree to Linked List
提示中说明了,改动后的链表相当于原树的前序遍历结果.前序遍历是根左右,因为要把转换后的左子树链接到根节点的右子树上,因此进入递归之后要先把节点的右子树保存下来,然后进入左子树,左子树转换后应该返回最后 ...
- Linux之nohup命令:实现退出终端后程序继续后台运行
转自:http://tech.ccidnet.com/art/302/20070618/1115599_1.html 简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后 ...
- listView/GridView getChild获取不到的解决方法
在onCreate或onResume中调用了getChildAt()方法,这时候adapter中的Item还没有放入到AdapterView中去.... 解决方法,当activity获得焦点事件的时候 ...
- wine的使用
ubuntu-ubuntu10.04使用wine安装SourceInsight http://www.cnblogs.com/eddy-he/archive/2012/03/08/ubuntu_win ...