Timer

public class TimerDemo extends TimerTask {


	@Override
	public void run() {
		System.out.println("task1");
	}


	public static void main(String[] args) {
		TimerDemo task1 = new TimerDemo();
		Timer t1 = new Timer();
		//对 Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生
		t1.schedule(task1, 1000);
		//程序并不会结束
	}


}



/**
 * 调用 timer的cancle方法时如果任务已经在执行则不会终止该任务,这一点与task.cancle()相同
 * @author DXtechnology
 *
 */
public class TimerDemo extends TimerTask {

	@Override
	public void run() {
		for(int i=0;i<5;i++){
			this.cancel();
			System.out.println("task1");
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
		
	}
	public static void main(String[] args) throws InterruptedException {
		TimerDemo task1 = new TimerDemo();	
		Timer t2=new Timer(false);
		t2.schedule(task1, 500);
		Thread.sleep(1000);
		t2.cancel();//任务继续执行但不会再接受其他任务
		t2.schedule(task1, 500);//Timer already cancelled.不会再接受task1
		System.out.println("结束");
		
	}

}




public class TimerDemo extends TimerTask {

	@Override
	public void run() {
		while(true){
			System.out.println("task1");
		}
		
	}
	public static void main(String[] args) {
		TimerDemo task1 = new TimerDemo();	
		//设置为守护线程
		Timer t2=new Timer(true);
		t2.schedule(task1, 1000);
		System.out.println("结束");//程序结束,正在执行的任务也会终止
		
	}

}

/**
 * 与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。
 * 如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务
 * 的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。
 * @author DXtechnology
 *
 */
public class TimerDemo extends TimerTask {

	@Override
	public void run() {
		for(int i=0;i<5;i++){
			System.out.println("task1");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
		System.out.println("task1:"+System.currentTimeMillis());
		
	}
	public static void main(String[] args) {
		TimerDemo  task1 = new TimerDemo();	
		TimerDemo2 task2 = new TimerDemo2();
	
		Timer t2=new Timer(false);
		t2.schedule(task1, 1000);
		t2.schedule(task2, 2000);
		System.out.println("结束");
		
	}

}
class TimerDemo2 extends TimerTask{

	@Override
	public void run() {
		System.out.println("task2:"+System.currentTimeMillis());
		
	}
	
}


/**
 * 如果任务安排为一次执行且还未运行,或者此任务安排为重复执行
 * 返回true
 * @author DXtechnology
 *
 */
public class TimerDemo extends TimerTask {

	@Override
	public void run() {
		for(int i=0;i<5;i++){
			System.out.println("task1");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
		System.out.println("task1:"+System.currentTimeMillis());
		
	}
	public static void main(String[] args) {
		TimerDemo  task1 = new TimerDemo();	
		Timer t2=new Timer(false);
//		t2.schedule(task1, 1000);
//	    System.out.println(task1.cancel());//true
	    t2.schedule(task1, 1000, 1000);//重复执行
	    System.out.println(task1.cancel());//true
		System.out.println("结束");
		
	}

}


/**
 *  如果此任务安排为一次执行且已经运行,或者此任务尚未安排,
 *  或者此任务已经取消,则返回 false。(一般来说,如果此方法不允许发生一个或多个已安排执行,则返回 true。)
 * @author DXtechnology
 *
 */
public class TimerDemo extends TimerTask {

	@Override
	public void run() {
		for(int i=0;i<5;i++){
			System.out.println("task1");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
		System.out.println("task1:"+System.currentTimeMillis());
		
	}
	public static void main(String[] args) throws InterruptedException {
		TimerDemo  task1 = new TimerDemo();	
		Timer t2=new Timer(false);
		t2.schedule(task1, 1000);
		Thread.sleep(2000);
	        System.out.println(task1.cancel());//false
		System.out.println("结束");
		
	}

}

Timer里面有4个schedule重载函数,而且还有两个scheduleAtFixedRate:
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定速率执行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
使用scheduleAtFixedRate的话,Timer会尽量的让任务在一个固定的频率下运行。比如,让一个Task每3秒钟执行一次,但是因为java不是实时的,所以,我们在上个程序中表达的原义并不能够严格执行,例如有时可能资源调度紧张4秒以后才执行下一次,有时候又3.5秒执行。如果我们调用的是scheduleAtFixedRate,那么Timer会尽量让你的secondTask执行的频率保持在3秒一次。所以就会有这样的情况:Task执行一次后,因为系统繁忙,之后的3.5秒后sTask才得以执行第二次,然后Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么2.5秒后,secondTask将执行的三次。“以固定的频率而不是固定的延迟时间去执行一个任务”就是这个意思。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值