当前位置: 首页 > news >正文

免费网站模板 怎么用今天新闻联播

免费网站模板 怎么用,今天新闻联播,wordpress主页如何加东西,做一个网购平台多少钱文章目录 1. 概要2. 固定速率和固定延时2.1 固定速率2.2 固定延时 3. API 解释3.1 schedule3.2 固定延时 - scheduleWithFixedDelay3.2 固定速率 - scheduleWithFixedDelay 4. 小结 1. 概要 前三篇文章的地址: 定时/延时任务-自己实现一个简单的定时器定时/延时任…

文章目录

  • 1. 概要
  • 2. 固定速率和固定延时
    • 2.1 固定速率
    • 2.2 固定延时
  • 3. API 解释
    • 3.1 schedule
    • 3.2 固定延时 - scheduleWithFixedDelay
    • 3.2 固定速率 - scheduleWithFixedDelay
  • 4. 小结

1. 概要

前三篇文章的地址:

  1. 定时/延时任务-自己实现一个简单的定时器
  2. 定时/延时任务-Timer用法
  3. 定时/延时任务-细说Timer源码

ScheduledThreadPoolExecutor Java 并发包 (java.util.concurrent) 中的一个类,同时也是 ThreadPoolExecutor 的一个子类,这就意味者 ScheduledThreadPoolExecutor 不像 Timer 中使用单个线程去执行任务,ScheduledThreadPoolExecutor 使用了线程池去执行,同时 ScheduledThreadPoolExecutor 也具备了 Timer 中的各种功能。

2. 固定速率和固定延时

2.1 固定速率

固定速率 策略表示任务在固定的时间间隔内重复执行,不管任务的执行时间有多长,如果任务的执行时间超过了时间间隔,那么下一个任务会在当前任务执行完毕之后就会马上开始执行,下面是一个例子:假设我们设置了一个固定速率为 5 的任务,从 0s 开始执行,也就是说这个任务 5s 执行一次:

  • 第一次执行:0s 开始执行一次,假设执行时间是 3s
  • 第二次执行:5s 开始执行第二次,假设执行的时候被阻塞了,执行了 8s
  • 第三次执行:13s 开始执行第三次,假设执行的时候被阻塞了,执行了 3s
  • 第四次执行:16s 开始执行第四次,假设执行的时候没有被阻塞
  • 第四次执行:20s 开始执行第五次,假设执行的时候没有被阻塞


2.2 固定延时

固定延时 策略表示任务在当前任务执行完成之后,固定延时一段时间再执行下一个任务,下面是一个例子:假设我们设置了一个固定速率为 5 的任务,从 0s 开始执行,也就是说这个任务 5s 执行一次:

  • 第一次执行:0s 开始执行一次,假设执行时间是 3s
  • 第二次执行:8s 开始执行第二次,假设执行的时候被阻塞了,执行了 8s
  • 第三次执行:21s 开始执行第三次,假设执行的时候被阻塞了,执行了 3s
  • 第四次执行:29 开始执行第四次,假设执行的时候没有被阻塞
  • 第四次执行:34s 开始执行第五次,假设执行的时候没有被阻塞

上面的例子中其实固定速率的执行和 Timer 是一样的,但是固定延时有点不一样,不知道你有没有发现,固定延时下执行的时候每一个任务和前一个任务的时间间隔一定是 任务执行时间 + 延时时间,其实相比于 TimerScheduledThreadPoolExecutor 的固定延时看起来更像是 “正宗” 一点的固定延时


3. API 解释

3.1 schedule

还是老规矩,先看下 ScheduledThreadPoolExecutor 的几个 API,看看用法是什么样的,首先就是 schedule 方法,这个方法就是普通的延时方法,只执行一次,非周期调度

public class Pra {public static void main(String[] args) {ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(16);Thread thread = new Thread(() -> {try {System.out.println("Thread-Current: " + Thread.currentThread().getName() + ", time = " + getTime());if (Math.random() < 0.5) {System.out.println("sleep: 3s");Thread.sleep(3000);} else {System.out.println("sleep: 8s");Thread.sleep(8000);}} catch (InterruptedException e) {e.printStackTrace();}}, "thread-executor-run");executor.schedule(thread, 0, TimeUnit.SECONDS);}private static String getTime() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");return sdf.format(new Date());}}

执行结果如下所示,延迟 0s 就开始执行任务
在这里插入图片描述
ScheduledThreadPoolExecutor 也提供了一个 callable 类型的任务的实现,使用 Callable 的好处就是可以获取任务的实现返回值,如下例子所示:

public class Pra {public static void main(String[] args) {ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(16);// 创建一个 Callable 任务Callable<Integer> task = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {System.out.println("Task is running on thread: " + Thread.currentThread().getName());return 1; // 返回结果}};// 调度 Callable 任务,在 0 秒后执行ScheduledFuture<Integer> future = executor.schedule(task, 0, TimeUnit.SECONDS);try {// 获取任务的结果Integer result = future.get();System.out.println("Task result: " + result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}private static String getTime() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");return sdf.format(new Date());}}

输出结果如下所示:
在这里插入图片描述

3.2 固定延时 - scheduleWithFixedDelay

public class Pra {public static void main(String[] args) {ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(16);Thread thread = new Thread(() -> {try {System.out.println("Thread-Current: " + Thread.currentThread().getName() + ", time = " + getTime());if (Math.random() < 0.5) {System.out.println("sleep: 3s");Thread.sleep(3000);} else {System.out.println("sleep: 8s");Thread.sleep(8000);}} catch (InterruptedException e) {e.printStackTrace();}}, "thread-executor-run");executor.scheduleWithFixedDelay(thread, 0, 5, TimeUnit.SECONDS);}private static String getTime() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");return sdf.format(new Date());}}

输入如下所示:
在这里插入图片描述
来分析一下:

  • 首先第一次任务 2024-11-24 19:19:36:698 启动,然后执行时间 3s
  • 第二次任务在 2024-11-24 19:19:44:718 启动,跟第一次任务相差 8s,延时 = 5s + 3s = 8s
  • 第三次任务在 2024-11-24 19:19:52:741 启动,跟第二次任务相差 8s,延时 = 5s + 3s = 8s
  • 第四次任务在 2024-11-24 19:20:05:760 启动,跟第三次任务相差 13s,延时 = 5s + 8s = 13s
  • 第五次任务在 2024-11-24 19:20:13:773 启动,跟第四次任务相差 8s,延时 = 5s + 3s = 8s
  • 第六次任务在 2024-11-24 19:20:26:787 启动,跟第五次任务相差 13s,延时 = 5s + 8s = 13s

可以看到 scheduleWithFixedDelay 的延时是相对于当前时间 + 延时时间的,跟 Timer 的固定延时任务有点不同

3.2 固定速率 - scheduleWithFixedDelay

public class Pra {public static void main(String[] args) {ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(16);Thread thread = new Thread(() -> {try {System.out.println("Thread-Current: " + Thread.currentThread().getName() + ", time = " + getTime());if (Math.random() < 0.5) {System.out.println("sleep: 3s");Thread.sleep(3000);} else {System.out.println("sleep: 8s");Thread.sleep(8000);}} catch (InterruptedException e) {e.printStackTrace();}}, "thread-executor-run");executor.scheduleAtFixedRate(thread, 0, 5, TimeUnit.SECONDS);}private static String getTime() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");return sdf.format(new Date());}}

输出结果如下:
在这里插入图片描述
来分析下上面的执行流程,需要注意的是,ScheduledThreadPoolExecutor 的固定速率任务会在当前任务执行完之后再添加下一次要执行的任务

  • 首先第一次任务 2024-11-24 16:23:25:762 启动,然后执行时间 8s,执行完之后会添加一个 2024-11-24 16:23:30 s 执行的任务,当前时间 2024-11-24 16:23:33 s
  • 第二次任务在 2024-11-24 16:23:33:770 启动,因为 2024-11-24 16:23:33:770 超过了 2024-11-24 16:23:30 s 这个时间点, 所以立刻执行,执行时间 3s,执行完之后往队列里面添加一个 2024-11-24 16:23:35 s 执行的任务,当前时间 2024-11-24 16:23:36 s
  • 第二次任务在 2024-11-24 16:23:36:784 启动,因为 2024-11-24 16:23:36:784 超过了 2024-11-24 16:23:35 s 这个时间点, 所以立刻执行,执行时间 3s,执行完之后往队列里面添加一个 2024-11-24 16:23:40 s 执行的任务,当前时间 2024-11-24 16:23:39 s
  • 第四次任务在 2024-11-24 16:23:40:739 启动,因为第三个任务执行完之后时间是 2024-11-24 16:23:39 s,还没有到第四个任务执行的时间点,这时候就等待,等到 2024-11-24 16:23:40:739,执行时间 3s,执行完之后往队列里面添加一个 2024-11-24 16:23:45 s 执行的任务,执行完的时间当前是 2024-11-24 16:23:42 s
  • 第五次任务在 2024-11-24 16:23:45:751 启动,因为第四个任务执行完之后时间是 2024-11-24 16:23:42 s,还没有到第五个任务执行的时间点,这时候就等待,等到 2024-11-24 16:23:45:751,执行时间 8s,执行完之后往队列里面添加一个 2024-11-24 16:23:50 s 执行的任务,执行完的时间当前是 2024-11-24 16:23:53 s
  • 第六次任务在 2024-11-24 16:23:53:763 启动,因为第六个任务执行时间是 2024-11-24 16:23:50 s,而执行完第五个任务已经是 2024-11-24 16:23:53 s了,超过任务的执行时间,所以会立马执行,执行时间 3s,执行完后往队列里面添加一个 2024-11-24 16:23:55 s 的任务,当前时间是 2024-11-24 16:23:56 s

其实上面的解释中可以把后面的毫秒去掉,这样比较方便理解

4. 小结

上面就是几个 API 了,其中固定速率的和 Timer 的实现方式有点不同,后续文章中,我会对 ScheduledThreadPoolExecutor 的源码进行详细的解析,当然在解析 ScheduledThreadPoolExecutor 之前首先需要知道下线程池的工作原理和工作流程,所以下一篇文章,我会说下线程池的工作原理


文章转载自:
http://tribble.rhmk.cn
http://sunstone.rhmk.cn
http://finsbury.rhmk.cn
http://physiology.rhmk.cn
http://huguenot.rhmk.cn
http://tolerate.rhmk.cn
http://asymptotical.rhmk.cn
http://burb.rhmk.cn
http://depreciatory.rhmk.cn
http://hypothenar.rhmk.cn
http://trucklingly.rhmk.cn
http://pinocytotic.rhmk.cn
http://omnivorous.rhmk.cn
http://clamatorial.rhmk.cn
http://helio.rhmk.cn
http://monochloride.rhmk.cn
http://palmist.rhmk.cn
http://horseplayer.rhmk.cn
http://eh.rhmk.cn
http://wop.rhmk.cn
http://ran.rhmk.cn
http://pulchritudinous.rhmk.cn
http://bull.rhmk.cn
http://watcher.rhmk.cn
http://rikisha.rhmk.cn
http://abnegator.rhmk.cn
http://replant.rhmk.cn
http://osculatory.rhmk.cn
http://unsleeping.rhmk.cn
http://anglo.rhmk.cn
http://venene.rhmk.cn
http://marinade.rhmk.cn
http://needlewoman.rhmk.cn
http://apercu.rhmk.cn
http://incessantly.rhmk.cn
http://quinquefoliolate.rhmk.cn
http://coadventure.rhmk.cn
http://rambouillet.rhmk.cn
http://egoboo.rhmk.cn
http://rush.rhmk.cn
http://dillydally.rhmk.cn
http://canner.rhmk.cn
http://yukin.rhmk.cn
http://claudicant.rhmk.cn
http://manger.rhmk.cn
http://tamarack.rhmk.cn
http://sephardic.rhmk.cn
http://moctezuma.rhmk.cn
http://jacksie.rhmk.cn
http://transdetermination.rhmk.cn
http://elastic.rhmk.cn
http://factionalize.rhmk.cn
http://abduct.rhmk.cn
http://vinelet.rhmk.cn
http://mumpish.rhmk.cn
http://pebbleware.rhmk.cn
http://cryoextractor.rhmk.cn
http://syllogism.rhmk.cn
http://penicillium.rhmk.cn
http://hypolithic.rhmk.cn
http://sorosis.rhmk.cn
http://glaringly.rhmk.cn
http://hypomanic.rhmk.cn
http://nrtya.rhmk.cn
http://forbearance.rhmk.cn
http://imprudent.rhmk.cn
http://dymaxion.rhmk.cn
http://aesopian.rhmk.cn
http://bifocal.rhmk.cn
http://plutology.rhmk.cn
http://jigotai.rhmk.cn
http://rhythmicity.rhmk.cn
http://sternness.rhmk.cn
http://biloculate.rhmk.cn
http://acme.rhmk.cn
http://epicist.rhmk.cn
http://superficialize.rhmk.cn
http://estimate.rhmk.cn
http://pronunciamento.rhmk.cn
http://alphorn.rhmk.cn
http://yordim.rhmk.cn
http://landwards.rhmk.cn
http://eighteenthly.rhmk.cn
http://lashio.rhmk.cn
http://rdx.rhmk.cn
http://interarticular.rhmk.cn
http://concluding.rhmk.cn
http://podotheca.rhmk.cn
http://vermiform.rhmk.cn
http://bootlace.rhmk.cn
http://fenderless.rhmk.cn
http://endobiotic.rhmk.cn
http://kirin.rhmk.cn
http://cannikin.rhmk.cn
http://forequarter.rhmk.cn
http://jensenism.rhmk.cn
http://patientless.rhmk.cn
http://hematinic.rhmk.cn
http://soweto.rhmk.cn
http://mayor.rhmk.cn
http://www.15wanjia.com/news/81141.html

相关文章:

  • 视频 播放网站怎么做的网络营销学什么内容
  • wordpress 站内通知百度竞价推广代运营
  • 236企业邮箱登录入口seo 是什么
  • 网站参数修改典型的网络营销案例
  • 五屏网站建设哪家有网站如何被百度快速收录
  • 物联网平台源码南昌网站seo
  • 免费微网站建设如何在google上免费推广
  • 品牌网站建设h合肥seo系统是什么
  • 做网站放太多视频海淀区seo引擎优化多少钱
  • 中国建筑装修装饰徐州网页关键词优化
  • 在百度云上建设网站seo外链工具软件
  • 企业网站维护怎么做微信广告
  • 网站开发前后端分离百度推广代理商查询
  • 网站哪家做的好最近发生的重大新闻
  • 网站建设 苏州网络营销期末总结
  • 域名连接到网站深圳网站建设服务
  • 互联网精准营销公司seo优化方案报价
  • 如何优化网站结构百度网盘客服电话
  • 安徽哪些地方封城了适合seo的建站系统
  • 嘉善建设局网站seo门户网站
  • 网站建设longdaseo整站优化系统
  • 网站观赏长沙企业seo服务
  • 如何配置网站服务器百度指数的数值代表什么
  • 免费制作照片的网站竞价推广公司
  • 做网站项目时 需求分析的内容长沙网络公司最新消息
  • 房地产排名seo技术培训班
  • 知名网站建设开发怎么做好推广和营销
  • 做营销型网站 推广的好处app拉新
  • 龙华网站建设销售员一站式网站设计
  • 郑州疫情最新情况最新消息seo超级外链工具