线程

通过调用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 平台上经常使用的定时器主要有两个:

  1. Java的Timer
  2. 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的差别的更多相关文章

  1. android 定时器(Handler Timer Thread AlarmManager CountDownTimer)

    Android实现定时任务一般会使用以上(Handler Timer Thread AlarmManager CountDownTimer)五种方式.当然还有很多组合使用(比如Handler+Thre ...

  2. android handler机制和Timer采用

    Timer主要用于创建一个任务来定期运行. 创建继承Task该任务等级.即任务每次跑. private class MyTask extends TimerTask { @Override publi ...

  3. Android 推送实现

    解决数据同步的问题:常用的方法有2种. (1) 定时去服务器上查询数据,也叫Polling. (2) 手机跟服务器之间维护一个 TCP 长连接,或者使用SMS,当服务器有数据时,实时推送到客户端,也就 ...

  4. Android开发之执行定时任务AlarmManager,Timer,Thread

    1.Thread:使用线程方式2.Timer是java的特性3.AlarmManager:AlarmManager将应用与服务分割开来后,使得应用程序开发者不用 关心具体的服务,而是直接通过Alarm ...

  5. 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 ...

  6. Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

    1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...

  7. 使用AlarmManager定期执行工作

    新建一个Service来模拟后台执行的程序,PollingService.java: package com.ryantang.rtpollingdemo; import android.app.No ...

  8. android AlarmManager 详解

    在开发互联网应用时候,我们常常要使用心跳来保证客户端与服务器的连接.怎么完成心跳很关键,在说道客户端心跳功能时,如果使用Timer或者专门开起一个线程来做心跳的工作,会浪费CPU工作时间,而且也会更多 ...

  9. Android AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

    AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的用法:(1)在指定时长后执行某项操 ...

随机推荐

  1. arcgis python 创建 SQLite 数据库

    # -*- ################# """ Tool name: Create SQLite Database Source: CreateSQLiteDat ...

  2. 基于curl的异步http实现

    简述用于windowsclient的一个异步http模块的实现 1.须要实现的feature 1.1 非常easy地发起异步http请求,然后回调. 1.2 可以管理http并发数. 1.3 可以支持 ...

  3. EF Code First 学习笔记:表映射 多个Entity到一张表和一个Entity到多张表

      多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 观察下面两个实体: public class Per ...

  4. 解决Sqoop报错Could not load db driver class: com.intersys.jdbc.CacheDriver

    报错栈: // :: INFO tool.CodeGenTool: Beginning code generation // :: ERROR sqoop.Sqoop: Got exception r ...

  5. IOS tableview 横向滚动

    1. UITableView 设置 CGRect tableViewRect = CGRectMake(0.0, 0.0, 50.0, 320.0);self.tableView = [[UITabl ...

  6. 【BZOJ】【2286】【SDOI2011】消耗战

    虚树+树形DP Orz ZYF……果然好神…… 建虚树先按dfn排序,再用一个单调栈来维护当前这条[链],往里加边……说实话还没弄懂- - 留个坑吧…… RE的原因:这条链往出退的时候没写top--; ...

  7. Mysql 查询注意和运行shell命令

    Mysql 查询注意 1. 在mysql查询的时候须要注意在表的前面加上数据库的前缀,不然就是默认是当前的数据库(当多个库查询的时候,可能会出现反复的查同样的表多次) 2. \! ls –al ,my ...

  8. [leetcode]Valid Number @ Python

    原题地址:http://oj.leetcode.com/problems/valid-number/ 题意:判断输入的字符串是否是合法的数. 解题思路:这题只能用确定有穷状态自动机(DFA)来写会比较 ...

  9. android系统访问自己的tomcat服务器下的项目不能访问的原因

    今天做android的一个下载功能,用自己机子上的tomcat做服务器,在tomcat上下载东西,可是android系统老是提示错误说不能连接到我的tomcat,可是我明明启动了tomcat服务啊,而 ...

  10. IOS开发-提升app性能的25条建议和技巧

    前言 这篇文章介绍了作者开发工作中总结的25个iOS开发tips, 多年之前读过这篇文章.收益良多,基本每一个tips在我的应用开发过程中都使用过.今天把这篇文章又一次整理转发下,与大家一起学习,不论 ...