Handler Timer TimerTask ScheduledExecutor 循环任务解析
使用Handler执行循环任务
private Handler handler = new Handler();
private int mDelayTime = 1000;
private Runnable runnable = new Runnable() {
@Override
public void run() {
if (mDelayTime > 0) {
Log.d(TAG, "run::time=" + mDelayTime);
handler.postDelayed(runnable, mDelayTime);
mDelayTime--;
}
}
};
handler.postDelayed(runnable, 1000);
Handler可以重复执行某个任务;Timer若在取消执行某个任务后,再次执行时会抛出IllegalStateException异常.需要再次创建一个Timer对象.
Handler可以调整循环执行的周期;而Timer需要消耗较大资源才能做到.
UI更新时,在创建Handler时可以指定所在的线程,一般在主线程中创建,更容易更新UI.
Handler的内存占比更低.
使用Timer和TimerTask执行定时或者循环任务
特定:当启动和取消任务时,可控制任务的执行;
第一次执行任务时,可以指定延迟时间;
Timer类用于任务的调度,TimerTask中的run()实现具体的任务;
Timer实例可以调度多任务,且是线程安全的;
Timer在构造时,创建了一个工作线程(子线程),该线程用于执行具体任务;
import java.util.TimerTask;
public class Task2 {
public static void main(String[] args) {
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("Hello !!!");
}
};
Timer timer = new Timer();
long delay = 0;
long intevalPeriod = 1 * 1000;
// schedules the task to be run in an interval
timer.scheduleAtFixedRate(task, delay,intevalPeriod);
} // end of main
}
ScheduledExecutorService执行定时或循环任务
ScheduledExecutorService类作为并发工具类被引入,是最理想的定时任务实现方式;
相比于Timer的单线程,上述方法通过线程池的方式来执行任务;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Task3 {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
public void run() {
System.out.println("Hello !!");
}
};
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
}
}
Handler Timer TimerTask ScheduledExecutor 循环任务解析的更多相关文章
- android 定时器(Handler Timer Thread AlarmManager CountDownTimer)
Android实现定时任务一般会使用以上(Handler Timer Thread AlarmManager CountDownTimer)五种方式.当然还有很多组合使用(比如Handler+Thre ...
- Timer&TimerTask原理分析
转载地址,请珍惜作者的劳动成果,转载请注明出处:http://www.open-open.com/lib/view/open1337176725619.html 如果你使用Java语言进行开发,对于定 ...
- JDK Timer & TimerTask
目录 Timer & TimerTask Binary Heap Insert DELETE MIN PERFORMANCE LifeCycle Constructor MainLoop sc ...
- 线程 Timer TimerTask 计时器 定时任务 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- [转]Handler MessageQueue Looper消息循环原理分析
Handler MessageQueue Looper消息循环原理分析 Handler概述 Handler在Android开发中非常重要,最常见的使用场景就是在子线程需要更新UI,用Handler ...
- 使用Handler和Timer+Timertask实现简单的图片轮播
布局文件就只放了一个简单的ImageView,就不展示了. 下面是Activity package com.example.administrator.handlerthreadmessagedemo ...
- Android Handler机制(三)----Looper源码解析
一.Looper Looper对象,顾名思义,直译过来就是循环的意思,从MessageQueue中不断取出message. Class used to run a message loop for a ...
- Android Handler机制(二)---MessageQueue源码解析
MessageQueue 1.变量 private final boolean mQuitAllowed;//表示MessageQueue是否允许退出 @SuppressWarnings(" ...
- viewPager+Handler+Timer简单实现广告轮播效果
基本思想是在Avtivity中放一个ViewPager,然后通过监听去实现联动效果,代码理由详细的解释,我就不说了. MainActivity.java package com.example.adm ...
随机推荐
- 关于macOS 管理员(Admin)权限问题。
最近突然想改下用户名,于是在用户与组里解锁,然后两个手指点击用户那一行,更改fullname,不过出于好奇把uid和uuid也改了. 之后发现current user等级由Admin变成Standar ...
- c语言编译四大步
-o: 指定生成后的文件名,后面跟指定的名称 四步:-E 预处理 > -S 编译 > -c 汇编 > 链接 -E: 表示预处理,生成文件为.i,会做宏(define)定义的展开.头文 ...
- C# Dictionary 泛型
Dictionary<string, string>是一个泛型,什么是泛型? 使用泛型下面是用泛型来重写上面的栈,用一个通用的数据类型T来作为一个占位符,等待在实例化时用一个实际的类型来代 ...
- SpringMVC整合Thymeleaf3
(1).pom添加相关依赖 <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thym ...
- spring boot启动项的问题
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...
- LeetCode.数字转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并 ...
- 【Linux】常见基础命令之系统操作
linux现在基本上已成为面试的必考题目,特此总结一些常用的基础命令. cd:切换目录 lilip@ubuntu:~$ cd /home/lilip/test pwd:打印当前目录 lilip@ubu ...
- 一, Python 一次性多行打印多个变量
>>> n = 123 >>> f = 456.789 >>> s1 = 'hello ,world' >>> s2 = 'he ...
- 不使用synchronized和lock 锁实现线程安全单例
单例实现方式一,锁机制 public class Singleton { private static Singleton singleton=null; public Singleton() { } ...
- centos6.6 minimal cannot found a valid baseurl for repo :base
网上找了很久,说什么NDS1=8.8.8.8,DNS2=4.2.2.2 也有说改ifcfg-eth0文件的 总之我都改了,但都没用 现在我把我修改的流程发上来 1.https://blog.csdn. ...