您的位置:首页 > 移动开发 > Android开发

Android多线程研究(2)——定时器

2014-05-20 22:51 267 查看
先来看一段代码:
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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: