像是一个闹钟定时,在一定时间之后被唤醒并执行某个之前设定好的任务,join(指定超时时间),sleep(指定休眠时间)都是基于系统内部的定时器来实现的。java.util.Timer核心方法就一个,schedule参数有两个:任务是啥(一段代码),多长时间之后执行
Timer内部组成
1.描述任务创建一个专门的类来表示一个定时器的任务TimerTask,这个MyTask类的比较规则不是默认存在的,需要我们手动指定按照时间大小来比较的。
2.组织任务通过一定的数据结构把一些任务给放到一起,标准库有一个专门的数据结构PriorityQueue,这里用到的数据结构是PriorityBlockingQueue,及带有优先级又带有阻塞队列。此处的队列要考虑到线程安全问题,可能在多个线程里进行注册任务,同时还有一个专门的线程来取任务执行,此时的队列就需要注意线程安全问题。其次为了避免盲等的现象,可以使用wait这样的机制指定等待时间时间到了自然唤醒,计算出当前时间和任务目标的时间差即可。既然是指定一个等待时间为啥不用sleep而是用wait,sleep不能被中途唤醒,wait能够被中途唤醒。在等待过程中可能有新的任务插入,新的任务是可能出现在之前所有任务的最前面,在schedule操作中就需要加上一个notify操作。
3.执行时间到了的任务需要执行时间最靠前的任务,就需要一个线程不停地去检查当前优先队列的对手元素,看看当前最靠前的任务是不是时间到了
到此这篇关于JavaEE线程安全定时器模式任务的文章就介绍到这了,更多相关JavaEE 定时器 内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!