Timer API

1.schedule(TimerTask,Date)  : 在给定的时间点运行task,若是给定的时间比当前迟。就会马上执行task。如:
@Test
public  void scheduleTest(){
	Timer timer = new Timer();
	TimerTask task = new TimerTask() {
		@Override
		public void run() {
			System.out.println("task running");
		}
	};
	
	timer.schedule(task, LocalDate.parse("2016-04-01").toDate());
	
}
当task执行完后其线程会一直处于等待状态,只要把Timer改为启动时建立一个守护线程就好了。如:
Timer timer = new Timer(true);

如上:当timer执行task时建立的是一个守护线程。等主线程销毁后其自动销毁 java

注意:以守护线程执行task时会有必定的风险,好比主线程提前结束了,可是有可能task还在处理中。这样task就可能被中断了 ide

2.一个timer可能有多个task,schedule方法调用屡次等于添加多个task了。每一个task是以队列的方式一个个被顺序执行的(前提是task执行时间都在一个点上),因此越排后的task就会被延迟执行,由于要等到前面task的执行完嘛。因此这与给定的执行时间点就会不一致。 spa

3.schedule(TimerTask,Date,long) 该方法的做用是在指定的日期以后,按指定的间隔周期性地无限循环执行某一任务 线程

public static void scheduleTest(){
	Timer timer = new Timer();
	
	timer.schedule(new TimerTask() {
		@Override
		public void run() {
			try {
				System.out.println("task1 begin and time is "+LocalDateTime.now().toString());
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}, LocalDateTime.now().plusSeconds(3).toDate(),4000);
	
	timer.schedule(new TimerTask() {
		@Override
		public void run() {
			System.out.println("task2 finished and time is "+LocalDateTime.now().toString());
		}
	}, LocalDateTime.now().plusSeconds(2).toDate())
	;
}
如所示,timer添加了两个task,一个是4秒执行一次(无限重复),一个是到点执行。

 注意若是task的处理时间大于4秒(延时),则下次的开始时间就是上次的结束时间若是task的处理时间小于4秒(正常),那么下次的开始时间=上次的开始+4秒 code

相关文章
相关标签/搜索