timer原理:https://www.cnblogs.com/yougewe/p/9729043.html
通过不断的轮循来处理的。
Java提供Timer和ScheduledThreadPoolExecutor两个类实现定时任务,其中Timer简单易用,但所有任务都是由同一个线程来调度,任务串行执行,任务之间存在互相干扰,
一是前一个任务的延迟会导致后面的任务延迟,源码如下:schedule与scheduleAtFixedRate区别
queue.rescheduleMin( task.period<0 ? currentTime - task.period : executionTime + task.period);
二是前一个任务异常导致后面的任务不再执行,如果执行时间大于period,schedule则会在任务完成后,经过period再执行新一次任务;而scheduleAtFixedRate就是保持不变的执行间隔。于是,新任务立马执行!所以,scheduleAtFixedRate的执行间隔变为每次任务执行完再执行新的一次。
三是Timer执行周期任务时依赖系统时间,如果当前系统时间发生变化(使用的是 System.currentTimeMillis()),执行行为也会出现变化。
相关queue,最小堆!!!: https://blog.csdn.net/zhangzhetaojj/article/details/81014408
注意的是,nanoTime和系统时间是完全无关的(之前一直以为只是时间戳的纳秒级粒度)
(Timer和ScheduledThreadPoolExecutor的区别https://www.jianshu.com/p/25eea3863d14)
各类queue分析
java这里有这么多queue, 是应该分析学习下各个的不同
- ConcurrentLinkedQueue: 一个由链表结构组成的非阻塞队列
- ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列
- LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列
- PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列
- DelayQueue:一个使用优先级队列实现的无界阻塞队列
- SynchronousQueue:一个不存储元素的阻塞队列
- LinkedTransferQueue:一个由链表结构组成的无界阻塞队列
- LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列
待续。。。
=========