专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java基础学习:java定时器

Java基础学习:java定时器

更新时间:2020-03-27 13:45:39 来源:动力节点 浏览2849次

     一、定时器:

  顾名思义,定时器是定时执行的任务。定时器的应用场景很广,比方说,定时更新排行榜的用户信息、定时刷新首页列表数据到缓存等等

  二、Java中实现定时任务的几种方式

  1、原生态Timer,优点是方便快速,缺点是每一个任务都需要占用一个线程资源,而且任务抛异常出去后,定时任务下次就不会在执行了

  2、ScheduledExecutorService,这是Java5以后提供的一个类,可以很方便的实现定时调度。

  ScheduledExecutorServiceservice=Executors.newScheduledThreadPool(5);//创建调度服务,线程池数量为5

  service.scheduleAtFixedRate(Runnablecommand,longinitialDelay,longperiod,TimeUnitunit);//开启调度,command是所要执行的任务,initialDelay是初始化延时时间,period是调度周期,unit是时间单位

  3、Spring提供的定时器,例如,以下例子是每一分钟执行一次的任务

  @Scheduled(cron="0*/1***?")

  publicvoidupdateXxx(){...}

  这种方式很方便,而且也是基于线程池的方式,数量可以通过xml配置。如果项目中有很多定时任务,那么就需要相对应的调大线程池数量,不然就得排队了。

  三、分布式定时器所遇到的问题

  分布式定时器:简单理解就是多个定时器同时部署,定时器中的各个任务相互协作

  可能遇到的问题(包括但不限于此):

  1、如何保证多个定时器中同一个任务只有一个在执行

  2、如何避免死锁

  3、另一个诡异的问题是,明明已经加锁了,但还是被重复执行了

  四、解决方案

  多个定时器中的同一个任务只有一个在执行。这个时候光靠Java本身提供的锁机制是没办法实现的,需要借助第三方的力量,这里使用的是Redis,因为它高效,性能好、单节点支持qps已经超过了1万,所以性能是非常高的。其中用到的是Redis的set命令。

  原型是:SETkeyvalue[EXseconds][PXmilliseconds][NX|XX]

  EXsecond:设置键的过期时间为second秒。

  PXmillisecond:设置键的过期时间为millisecond毫秒。

  NX:只在键不存在时,才对键进行设置操作。

  XX:只在键已经存在时,才对键进行设置操作。

  例子:

  setmylock192.168.1.100EX5NX

  上边的例子中设置key为mylock,value为192.168.1.100,EX5表示过期时间为5秒钟,NX表示当key不存在的时候再设置。这里为什么要把value设置为IP呢,原因是可以追踪是谁占有着这把锁。

  设置成功时返回OK,失败则返回nil,利用这个特性就可以实现分布式锁了。其中设置5秒的过期时间可以避免死锁的发生

Java基础学习:java定时器

  以上就是动力节点java培训机构的小编针对“Java基础学习:java定时器”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>