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(); } }