Android多线程研究(2)——定时器
来源:互联网 发布:华语网络双年奖 编辑:程序博客网 时间:2024/05/28 11:49
先来看一段代码:
public static void main(String[] args) {new Timer().schedule(new TimerTask() {@Overridepublic void run() {System.out.println("阳光小强");}}, 5000);int i = 0;while(true){System.out.println(i++);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
将上面代码修改如下:
new Timer().schedule(new TimerTask() {@Overridepublic void run() {System.out.println("阳光小强");}}, 2000, 3000);此时定时器Timer就会在2000ms后开始执行run方法,每隔3000ms重复执行。
如果有一种需求,隔1s、2s、1s、2s......分别执行定时器中的代码(偶数秒和奇数秒分别执行不同的定时器),我们如何实现(s代表秒)
实现方式一:
public static void main(String[] args) {new Timer().schedule(new TimerTask() {@Overridepublic void run() {System.out.println("阳光小强2秒");new Timer().schedule(new TimerTask() {@Overridepublic void run() {System.out.println("阳光小强4秒");}}, 1000);}}, 1000, 2000);int i = 0;while(true){System.out.println(i++);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}实现方式二:
static int count = 0;public static void main(String[] args) {class MyTimerTask extends TimerTask{@Overridepublic void run() {count = (count + 1) % 2;System.out.println("阳光小强" + (2 + 2 * count) + "秒");new Timer().schedule(new MyTimerTask(), 2000 + 2000 * count);}}new Timer().schedule(new MyTimerTask(), 2000);int i = 0;while(true){System.out.println(i++);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}还有一种实际情况就是定时发邮件,我们可以用下面的方式
import java.util.Calendar;import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class TestTimer {// 时间间隔private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;public static void main(String[] args) {Calendar calendar = Calendar.getInstance();/*** 定制每日2:00执行方法 ***/calendar.set(Calendar.HOUR_OF_DAY, 2);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);Date date = calendar.getTime(); // 第一次执行定时任务的时间// 如果第一次执行定时任务的时间 小于 当前的时间// 此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。if (date.before(new Date())) {date = addDay(date, 1);}new Timer().schedule(new TimerTask() {@Overridepublic void run() {//TODO 去发邮件,或者其他定时任务}}, date, PERIOD_DAY);}// 增加或减少天数public static Date addDay(Date date, int num) {Calendar startDT = Calendar.getInstance();startDT.setTime(date);startDT.add(Calendar.DAY_OF_MONTH, num);return startDT.getTime();}}
11 0
- Android多线程研究(2)——定时器
- Android多线程研究(9)——线程锁Lock
- Android多线程研究(9)——读写锁
- Android多线程研究(9)——线程锁Lock
- linux下的定时器—多线程(2)
- Android多线程研究(6)——多线程之间数据隔离
- 【多线程】——定时器Timer
- java基础——多线程(传统定时器)
- java基础——多线程(传统定时器)
- Android多线程研究(1)——线程基础及源码剖析
- Android多线程研究(3)——线程同步和互斥及死锁
- Android多线程研究(4)——从一道面试题说起
- Android多线程研究(5)——线程之间共享数据
- Android多线程研究(7)——Java5中的线程并发库
- Android多线程研究(8)——Java5中Futrue获取线程返回结果
- Android多线程研究(8)——Java中的原子性理解
- C#的多线程(2)——机制探索 线程池和定时器——多线程的自动管理
- Java多线程——7 定时器
- 404页面分析 数据分析
- 今日食谱及作息
- assert出问题了?
- 华为初级——句子逆序
- jstl 表达式 收藏
- Android多线程研究(2)——定时器
- XML编程中dom解析与sax解析的区别
- HTTP协议漫谈
- Http协议----学习笔记
- apt-get update报错处理
- 将Storm源码导入Eclipse
- unity 获取物体尺寸
- 网站图片扫描类
- 关于回调函数的参数