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








  • 相关阅读:
    P1144 最短路计数
    P2966 [USACO09DEC]牛收费路径Cow Toll Paths
    P2419 [USACO08JAN]牛大赛Cow Contest
    P1462 通往奥格瑞玛的道路
    P1346 电车
    P1339 [USACO09OCT]热浪Heat Wave
    P1418 选点问题
    P1330 封锁阳光大学
    P1182 数列分段Section II
    P2661 信息传递
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468947.html
Copyright © 2020-2023  润新知