线程

通过调用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. FitLayout

    <HTML> <HEAD> <TITLE>布局</TITLE> <link rel="stylesheet" type=&qu ...

  2. 【docker】 docker容器内部安装vi命令

    有时会需要在docker容器内使用vi命令,但是新启动的docker容器内并没有vi命令,那就需要自己安装一个 1.使用命令 apt-get update 2.进行安装 apt-get install ...

  3. Google Ads原理

    Google AdSense广告会根据访问者的地理IP,显示不同的广告,因为adwords里面有相应的设置,有些广告商只想把广告显示给某一地理区域的客户.另一方面就是同一个网站,你在日本和美国会看到日 ...

  4. MongoDB:如何正常关闭服务(转)

    原文链接:MongoDB:关闭服务 MongoDB 提供几种关闭服务的命令,具体为以下: 一 使用 Crtl+C 关闭  [mongo@redhatB data]$ mongod --dbpath=/ ...

  5. Java中使用Jedis操作Redis之二

    import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.J ...

  6. [9] 圆环(Ring)图形的生成算法

    顶点数据的生成 bool YfBuildRingVertices ( Yreal radius, Yreal assistRadius, Yreal height, Yuint slices, Yui ...

  7. 浅析Linux线程调度

    在Linux中,线程是由进程来实现,线程就是轻量级进程( lightweight process ),因此在Linux中,线程的调度是按照进程的调度方式来进行调度的,也就是说线程是调度单元.Linux ...

  8. IE6的3像素神奇bug:缘起与解决方案

    在我们这样一个神奇的国度,到了2014年了,居然还是有很多人的电脑上用着XP,安装的是IE6,他们没有想过要升级,我们就得想着兼容他们.... 一. 6爷我喝高了,最后一行有重影.那什么是IE6 的3 ...

  9. 转: MAC认证码的说明

    转: http://blog.sina.com.cn/s/blog_4940e1fc01012vk3.html MAC(Message Authentication Code) 消息认证码(带密钥的H ...

  10. C#.NET常见问题(FAQ)-listView如何显示网格线

    把GridLines设置为True     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123   我的在线论坛: http:/ ...