Android多线程研究(2)——定时器
先来看一段代码:
public static void main(String[] args) {
new Timer().schedule(new TimerTask() {
@Override
public 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() {
@Override
public 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() {
@Override
public void run() {
System.out.println("阳光小强2秒");
new Timer().schedule(new TimerTask() {
@Override
public 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{
@Override
public 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() { @Override
public 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();
} }
Android多线程研究(2)——定时器的更多相关文章
- Android多线程研究(6)——多线程之间数据隔离
在上一篇<Android多线程研究(5)--线程之间共享数据>中对线程之间的数据共享进行了学习和研究,这一篇我们来看看怎样解决多个线程之间的数据隔离问题,什么是数据隔离呢?比方说我们如今开 ...
- Android多线程研究(1)——线程基础及源代码剖析
从今天起我们来看一下Android中的多线程的知识,Android入门easy,可是要完毕一个完好的产品却不easy,让我们从线程開始一步步深入Android内部. 一.线程基础回想 package ...
- Android多线程研究(1)——线程基础及源码剖析
从今天起我们来看一下Android中的多线程的知识,Android入门容易,但是要完成一个完善的产品却不容易,让我们从线程开始一步步深入Android内部. 一.线程基础回顾 package com. ...
- Android多线程研究(7)——Java5中的线程并发库
从这一篇开始我们将看看Java 5之后给我们添加的新的对线程操作的API,首先看看api文档: java.util.concurrent包含许多线程安全.测试良好.高性能的并发构建块,我们先看看ato ...
- Android多线程研究(4)——从一道面试题说起
有一道这种面试题:开启一个子线程和主线程同一时候运行,子线程输出10次后接着主线程输出100次,如此重复50次.先看以下代码: package com.maso.test; /** * * @auth ...
- Android多线程研究(3)——线程同步和相互排斥及死锁
为什么会有线程同步的概念呢?为什么要同步?什么是线程同步?先看一段代码: package com.maso.test; public class ThreadTest2 implements Runn ...
- Android多线程研究(9)——读写锁
一.什么是锁 在Java的util.concurrent.locks包下有关于锁的接口和类如下: 先看一段代码: package com.codeing.snail.test; public clas ...
- Android多线程研究(8)——Java中的原子性理解
一.什么是原子性 原子性是世界上最小单位,具有不可分割性.比如a=0;(a非long和double类型)这个操作是不可分割的,那么我们说这个操作是原子操作.再比如:a++;这个操作实际上是a=a+1; ...
- Android多线程研究(9)——线程锁Lock
在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock. Lock接口的实现类提供了比使用synchronized关键字更加灵活 ...
随机推荐
- 关于ThinkPHP中的时间自动填充
<?php class NewsModel extends Model{ protected $_auto = array( array('time_at','mydate','1','call ...
- Django中请求的生命周期
1. 概述 首先我们知道HTTP请求及服务端响应中传输的所有数据都是字符串. 在Django中,当我们访问一个的url时,会通过路由匹配进入相应的html网页中. Django的请求生命周期是指当用户 ...
- Jdbc访问数据库篇
一万年太久,只争朝夕 What JDBC 上部 JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持 java. ...
- Linux端图形处理工具ImageMagick在Centos上的安装
一.安装背景程序要用到用户上传图片,编辑的功能,能进行旋转,裁剪,缩放等. 二.ImageMagick介绍 ImageMagick是用C语言开发图片处理程序.可以对图片进行改变大小.旋转.锐化.减色或 ...
- Instrumentation 框架简介
原文地址:http://www.cnblogs.com/xirihanlin/archive/2010/06/15/1758677.html Android提供了一系列强大的测试工具,它针对Andro ...
- (三):C++分布式实时应用框架——系统管理模块
C++分布式实时应用框架--系统管理模块 上篇:(二): 基于ZeroMQ的实时通讯平台 一个分布式实时系统集群动辄上百台机器,集群的规模已经限定这将是一个"封闭"的系统.你不可能 ...
- enote笔记法(2)——why的使用
章节:why的使用 用法: why 概念|词汇(比概念更一般的形式的keyword)|短语|句子 用法1: why 概念|why keyword([比概念更一般的形式的keyword]) “why 概 ...
- AES加密实现
起因 这段时间因为要对接一个外部接口,其参数的加密方式为AES,就需要学下AES的加密写法,但网上的资料不是很全,自己记录下遇到的坑: 基本写法 String str = "hello&qu ...
- Natural Merge Sort(自然归并排序)
This is a Natural Merge Sort program from my textbook. It works, but I don't think it's good. // Nat ...
- python3学习笔记(1)
一.模块初识(接上篇)模块(库)分为两种:1.标准库:不需要安装直接可以导入的库,例:getpass.2.第三方库:必须要下载安装才可以使用.注:编辑的模块文件名不能与导入的模块名重复. 在模块文件中 ...