java 定时器的多种实现方式有哪些,java定时器的实现方式有几种,Java 定时器的多种实现方式

java 定时器的多种实现方式有哪些,java定时器的实现方式有几种,Java 定时器的多种实现方式

本文介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vue中的定时器清不掉,vue设置定时器调用方法,vue如何设置定时器和清理定时器
  • js定时方法,js的定时器函数
  • js定时方法,js的定时器函数,js定时器的使用(实例讲解)
  • js定时器重复执行怎么停止,js每隔几秒执行一次
  • js定时器重复执行怎么停止,js每隔几秒执行一次,js定时器(执行一次、重复执行)
  • js定时器重复执行怎么停止,,js定时器(执行一次、重复执行)
  • js中2种定时器的使用及清除的实现过程,js中两种定时器的设置及清除
  • js中2种定时器的使用及清除的实现过程,js中两种定时器的设置及清除,JS中2种定时器的使用及清除的实现
  • ,,Qt定时器和随机数详解
  • ,,Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例
  • ,,IOS 中NSTimer定时器的使用
  • C语言定时器,c语言定时器程序编写
  • C语言定时器,c语言定时器程序编写,C语言实现简单的定时器
  • java 定时器的多种实现方式有哪些,java定时器的实现方式有几种
  • ,,Java中的定时器Timer详解
  • 留言与评论(共有 条评论)
       
    验证码: