本文介绍了Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)中定时器的多种实现方式,有此需求的朋友可以根据实际选择适合自己的方式
目录
一、前言
(1)定时器
(2)延迟队列延迟队列
(3)调度线程池执行程序
(4)调度线程池执行程序
一、前言
定时器有三种表现形式:
按固定周期定时执行
延迟一定时间后执行
指定某个时刻执行
JDK提供了三种常用的定时器实现方式,分别为:
计时器
延迟队列延迟队列
ScheduledThreadPoolExecutor
(1)定时器
发现尤里卡中大量使用了计时器定时器:
计时器属于JDK比较早期版本的实现,它可以实现固定周期的任务,以及延迟任务。
计时器会起动一个异步线程去执行到期的任务,任务可以只被调度执行一次,也可以周期性反复执行多次。
计时器是如何使用的,示例代码如下:
Timer Timer=new Timer();
timer.scheduleAtFixedRate(新TimerTask() {
@覆盖
公共无效运行(){
//业务代码
}
}, 5000, 5000);//5s后调度一个周期为5s的定时任务
定时器任务是实现了可追捕的接口的抽象类
计时器负责调度和执行定时器任务
计时器的内部构造,如下:
公共类计时器{
//小根堆,运行操作O(1),新增o(登录)、取消o(登录)
私有最终任务队列queue=新任务队列();
//创建另外线程,任务处理,会轮询长队
私有最终定时器线程线程=新定时器线程(队列);
公共计时器(字符串名称){
thread.setName(名称);
线程。start();
}
}
计时器它是存在不少设计缺陷的,所以并不推荐用户使用:
计时器是单线程模式,如果某个定时器任务执行时间很久,会影响其他任务的调度。
计时器的任务调度是基于系统绝对时间的,如果系统时间不正确,可能会出现问题。
定时器任务如果执行出现异常,计时器并不会捕获,会导致线程终止,其他任务永远不会执行。
(2)延迟队列延迟队列
特征如下:
延迟队列是JDK中一种可以延迟获取对象的阻塞队列,其内部是采用优先级队列优先级队列存储对象
延迟队列中的每个对象都必须实现延时的接口,并重写比较和getDelay方法
延迟队列的使用方法如下:
公共类延迟队列测试{
公共静态void main(String[] args)引发异常{
BlockingQueueSampleTask延迟队列=新延迟队列();
龙现在=系统。当前时间毫秒();
delayQueue.put(新的样本任务(现在是1000));
delayQueue.put(新的样本任务(现在是2000));
delayQueue.put(新的样本任务(现在3000));
for(int I=0;i3;i ) {
System.out.println(新日期(delayQueue.take().getTime()));
}
}
静态类样本任务实现延迟的{
时间长;
公共样本任务(长时间){
this.time=时间;
}
public long getTime() {
返回时间;
}
@覆盖
公共int compareTo(Delayed o) {
返回long。对比(这个。获取延迟(时间单位.毫秒),o.getDelay(时间单位。毫秒));
}
@覆盖
公共长getDelay(时间单位单位){
返回单位。转换(时间-系统。当前时间毫秒()、时间单位.毫秒);
}
}
}
(3)调度线程池执行程序
JDK提供了功能更加丰富的ScheduledThreadPoolExecutor
公共类ScheduledExecutorServiceTest {
公共静态void main(String[] args) {
ScheduledExecutorService executor=executors。newscheduledthreadpool(5);
执行人。scheduleatfixedrate(()-system。出去。println(' Hello World '),1000,2000,时间单位.毫秒);//1s延迟后开始执行任务,每2s重复执行一次
}
}
ScheduledThreadPoolExecutor使用了阻塞队列DelayedWorkQueue。
(4)ScheduledThreadPoolExecutor
线程应该是最常见的实现方案,创建一个线程执行任务即可,举例几个不同的写法,代码如下
4.1.使用线程可运行
包com。叶紫工具。demo _ basic。测试;
导入org。spring框架。刻板印象。组件;
导入Java。util。日期;
@组件
公共类ThreadTest {
私有整数计数=0;
公共ThreadTest() {
test1();
}
公共void test1() {
新线程(()- {
而(计数10) {
System.out.println(新日期()。toString()':' count);
数数;
尝试{
线程。睡眠(3000);
} catch (InterruptedException e) {
e。printstacktrace();
}
}
}).start();
}
}
4.2.使用线程池可追捕的
包com。叶紫工具。demo _ basic。测试;
导入org。spring框架。刻板印象。组件;
导入Java。util。日期;
导入Java。util。并发。执行服务;
导入Java。util。并发。遗嘱执行人;
@组件
公共类ThreadTest {
私有静态最终执行器服务线程池=执行器。newfixedthreadpool(5);//线程池
私有整数计数=0;
公共ThreadTest() {
test2();
}
public void test2() {
threadPool.execute(() - {
而(计数10) {
System.out.println(新日期()。toString()':' count);
数数;
尝试{
线程。睡眠(3000);
} catch (InterruptedException e) {
e。printstacktrace();
}
}
});
}
}
以上就是Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)定时器的多种实现方式的详细内容,更多关于Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)定时器的实现的资料请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。