@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