郴州建设企业网站,网站建设要做些什么问题,小型工作室项目大全,棋牌源码资源网Timer 简述 在Java中#xff0c;Timer#xff08;计时器#xff09;是一个用于安排定时任务的类。它可以实现在指定的时间间隔或指定的时间点执行某项任务或操作。 简单的来说Timer就是在Java中用来实现定时任务的工具。 
Timer的API 
Timer中有两API可以使用分别是schedule…Timer 简述 在Java中Timer计时器是一个用于安排定时任务的类。它可以实现在指定的时间间隔或指定的时间点执行某项任务或操作。 简单的来说Timer就是在Java中用来实现定时任务的工具。 
Timer的API 
Timer中有两API可以使用分别是schedule()和scheduleAtFixedRate() 
schedule /*** 表示在指定的延迟时间后执行任务只执行一次* param task 表示要执行的任务或操作* param delay 延时时间*/public void schedule(TimerTask task, long delay)/*** 表示在指定的延迟时间后首次执行任务并且之后在每个周期内重复执行任务* param task 表示要执行的任务或操作* param delay 延时时间* param period 执行周期*/public void schedule(TimerTask task, long delay, long period)scheduleAtFixedRate /*** 表示在指定的延迟时间后执行任务只执行一次* param task 表示要执行的任务或操作* param delay 延时时间*/public void scheduleAtFixedRate(TimerTask task, long delay, long period)/*** 表示在指定的延迟时间后首次执行任务并且之后在每个周期内重复执行任务* param task 表示要执行的任务或操作* param firstTime 任务的首次执行时间* param period 执行周期*/public void schedule(TimerTask task, Date firstTime, long period)Timer的使用 
public class TimerDemo {public static void main(String[] args) {final Timer timer  new Timer();// schedule和scheduleAtFixedRate的用法是同理的timer.schedule(new TimerTask() {Overridepublic void run() {new Thread(() -{System.out.println(1);});}//第一次执行是在当前时间的一秒之后之后每隔一秒钟执行一次}, 2000, 2000);}
}Timer虽然说在Java中使用的很频繁但是Timer在某些情况下是存在问题的他会导致定时任务的执行混乱 我们先来说结论 schedule的问题就是如果执行时长超过了设定的延迟时间下一次任务会立即开始即在上次任务结束后立即执行 scheduleAtFixedRate的问题就是不管任务的执行时长如何每次任务都会在固定的时间间隔内开始 
我这么说可能有很多小伙伴不明白是什么意思 我简单的来解释一下针对于schedule如果我的某一次任务timeout了并且我超时间的时间要长于我设定的period也就是延时时间那当我本次任务执行完之后我本来设置的下一次的任务就会立刻执行我在同一时间就会执行两次相同的任务。 而scheduleAtFixedRate呢比如你设置了一个定时任务想让他在10分钟内跑2次也就是每5分钟跑一次同样的我还是有一个任务timeout了并且大于了5分钟此时10分钟内该定时任务就不一定会跑2次了。scheduleAtFixedRate虽然保证了每次任务执行之间的时间间隔但是无法保证在相同的时间内可以执行你所预期的次数。 
大家可以自己试验一下比如设定每2秒执行一次但是在任务中间执行的时候给他sleep3秒钟你就会发现你的定时任务乱掉了。 
最后说一下是因为什么会出现这些问题看源代码可以知道Timer其实是一个单线程执行它需要等前一个任务执行完之后再去执行下一个任务。所以如果你想要不出现这种问题可以采用线程池的方式或者在Timer里面自己定义一个多线程 
具体的源代码分析我会放在下一个章节