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

小游戏网站开发者短视频营销推广策略

小游戏网站开发者,短视频营销推广策略,网站建设开发报价,沈阳中讯国际网站建设IDE:IntelliJ IDEA 2022.2.3 x64 操作系统:win10 x64 位 家庭版 JDK: 1.8 文章目录 一、Timer类是什么?二、Timer类主要由哪些部分组成?1.TaskQueue2. TimerThread 三、示例代码分析四、自定义TimerTask为什么会发生任务相互阻塞的…

IDE:IntelliJ IDEA 2022.2.3 x64
操作系统:win10 x64 位 家庭版
JDK: 1.8


文章目录

  • 一、Timer类是什么?
  • 二、Timer类主要由哪些部分组成?
    • 1.TaskQueue
    • 2. TimerThread
  • 三、示例代码分析
  • 四、自定义TimerTask为什么会发生任务相互阻塞的问题?
    • 4.1 使用schedule添加任务,如任务执行超时,会导致任务丢失(少执行)
    • 4.2 使用scheduleAtFixedRate添加任务,如任务执行超时,会导致任务执行时间乱掉,下一个任务会马上执行
  • 五、Timer类的应用特性
  • 六、如何解决任务阻塞问题?


在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、Timer类是什么?

Java Timer类是一个用于调度任务的类,它可以在指定的时间间隔内执行一次或多次任务。它提供了一种简单的方式来安排和执行定时任务,可以用于各种应用程序中,如计划任务、定时器等。

Java Timer类位于java.util包中,它有两个主要的子类:Timer和TimerTask。其中,Timer类用于调度任务,而TimerTask类则表示一个具体的任务,需要实现run()方法来定义任务的具体行为。

使用Java Timer类可以方便地创建和管理定时任务,但需要注意的是,它的精度有限,如果需要更高精度的任务调度,可以考虑使用ScheduledThreadPoolExecutor等其他工具。


二、Timer类主要由哪些部分组成?

在这里插入图片描述

1.TaskQueue

官方解释

The timer task queue:This data structure is shared with the timer thread. The timer produces tasks, via its various schedule calls, and
the timer thread consumes, executing timer tasks as appropriate, and
removing them from the queue when they’re obsolete.

在这里插入图片描述

一句话,就是一个用于存储和处理任务的队列,里面存放TimeTask

2. TimerThread

官方解释

The timer thread.

在这里插入图片描述

显而易见,就是处理线任务的线程


三、示例代码分析

示例代码如下所示

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;public class myTimerTest {public static void main(String[] args){Timer timer = new Timer(); //任务执行for (int i = 0; i < 2 ; i++) {TimerTask timerTask = new FooTimerTask("FooTimerTask"+i);//将timerTask以当前时间执行,以2秒时间为间隔再次触发,即12:00:00执行,那么12:00:02 会再次触发执行timer.schedule(timerTask,new Date(),2000);//任务添加}}
}class FooTimerTask extends TimerTask {private String name;public FooTimerTask(String name) {this.name = name;}@Overridepublic void run() {try {System.out.println(name+" - startTime = "+new Date());//延迟3秒执行Thread.sleep(3000);System.out.println(name+" - endTime = "+new Date());} catch (InterruptedException e) {e.printStackTrace();}}
}

注意

其中,任务会在 Timer timer = new Timer();时执行,而并非大家认为的在timer.schedule(timerTask,new Date(),2000);时执行,该代码是将该timerTask添加到TaskQueue中(任务队列中)

不信,请看如下的源代码

①在new Timer()时执行任务
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

②在timer.schedule(timerTask,new Date(),2000)时添加任务至任务队列中
在这里插入图片描述
在这里插入图片描述

通过上述源代码演示,Timer类是在new Timer()中以多线程的方式运行TimerThread的start()方法,进而调用其中的run()方法。而我们自子自定义的FooTimerTask 的run()方法却是以单线程的方式被调用。
在TimerThread中的run方法中mainLoop方法里以死循环不断检查是否有任务需要开始执行了,有就执行它,执行任务也是用这个线程执行。

何以见得?

在mainLoop方法中
在这里插入图片描述
我们自定义的FooTimerTask会以单线程的方式执行,这样任务可能会相互阻塞


四、自定义TimerTask为什么会发生任务相互阻塞的问题?

4.1 使用schedule添加任务,如任务执行超时,会导致任务丢失(少执行)

示例代码如下所示

public class myTimerTest {public static void main(String[] args){Timer timer = new Timer(); //任务执行for (int i = 0; i < 2 ; i++) {TimerTask timerTask = new FooTimerTask("FooTimerTask"+i);//将timerTas以当前时间执行,间隔2s后触发执行,比如在12:00:00执行timerTas,下一次触发就是12:00:02时执行,余者类推timer.schedule(timerTask,new Date(),2000);//任务添加}}
}class FooTimerTask extends TimerTask {private String name;public FooTimerTask(String name) {this.name = name;}@Overridepublic void run() {try {System.out.println(name+" - startTime = "+new Date());//延迟3秒执行Thread.sleep(3000);System.out.println(name+" - endTime = "+new Date());} catch (InterruptedException e) {e.printStackTrace();}}
}

示例运行如下

在这里插入图片描述

这里有个问题:根据上述代码定义,自定义timerTask会在间隔2s后执行,而timerTask自己的执行会延迟3s才会真正结束,那么我们所推测它的执行场景应该是这样的:

假如任务A在12:00:00开始执行,12:00:03执行结束,那么下一个任务B将会在12:00:05开始执行

但上述代码的运行结果却与我们的推测 大相径庭

思考①

那如果timerTask去掉延迟3s的代码,运行结果应该是如“任务A在12:00:00开始执行,12:00:0执行结束,那么下一个任务B将会在12:00:03开始执行”这样执行吧?

代码示例如下

class FooTimerTask extends TimerTask {private String name;public FooTimerTask(String name) {this.name = name;}@Overridepublic void run() {System.out.println(name+" - startTime = "+new Date());System.out.println(name+" - endTime = "+new Date());
//        try {
//            System.out.println(name+" - startTime = "+new Date());
//            //延迟3秒执行
//            Thread.sleep(3000);
//            System.out.println(name+" - endTime = "+new Date());
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }}
}

运行如下
在这里插入图片描述
看来,任务阻塞的问题就出现在延迟3s的代码上

思考②

如果一个任务本身执行时间过长,超过预设的时间间隔(即任务执行超时),为什么会发生任务阻塞的问题?

任务阻塞问题;会导致后面的任务往后推移,预想在这个间隔内存在的任务执行就没了,任务少执行了【假如在10s的时间段内,任务正常执行5次,假如发生任务超时,可能会执行3-4次】

通过如下追踪源代码可知

①追踪进入schedule()方法中
在这里插入图片描述

注意:schedule方法将period值加了负号,即-period

②追踪进入sched()方法中
在这里插入图片描述

任务task的nextExecutionTime被赋值为time(传入的时间)

③追踪进入run()方法中的mainLoop()方法中
在这里插入图片描述

④追踪进入queue.rescheduleMin()方法中
在这里插入图片描述
⑤追踪进入fixDown()方法中
在这里插入图片描述

结论

由此可知,schedule里Timertask真正的执行时间取决上一个任务的结束时间,并非以预设的时间为准,故如某一个任务执行超时,则有可能出现任务丢失的问题

4.2 使用scheduleAtFixedRate添加任务,如任务执行超时,会导致任务执行时间乱掉,下一个任务会马上执行

示例代码如下所示

public class myTimerTest {public static void main(String[] args){Timer timer = new Timer(); //任务执行for (int i = 0; i < 2 ; i++) {TimerTask timerTask = new FooTimerTask("FooTimerTask"+i);timer.scheduleAtFixedRate(timerTask,new Date(),2000);}}
}class FooTimerTask extends TimerTask {private String name;public FooTimerTask(String name) {this.name = name;}@Overridepublic void run() {try {System.out.println(name+" - startTime = "+new Date());//延迟3秒执行Thread.sleep(3000);System.out.println(name+" - endTime = "+new Date());} catch (InterruptedException e) {e.printStackTrace();}}
}

运行如下

在这里插入图片描述

思考

为什么一旦任务发生超时,下一个任务会马上触发执行?

通过如下追踪源代码可知

①追踪进入schedule()方法中
在这里插入图片描述

②追踪进入sched()方法中
在这里插入图片描述

任务task的nextExecutionTime被赋值为time(传入的时间)

③追踪进入run()方法中的mainLoop()方法中
在这里插入图片描述

注:剩余追踪步骤和4.1小节一致,故不予展示

结论

scheduLeAtFixedRate()方法会严格按照预设时间作为TimerTask的执行时间,如果发生任务超时,下一个任务会直接触发


五、Timer类的应用特性

  • 运行时异常会导致timer线程终止
  • 任务调度是基于绝对时间的,对系统时间敏感

六、如何解决任务阻塞问题?

解决方案

在自定义TimerTask里的run()方法里使用线程池去执行,即可解决上述问题



文章转载自:
http://reactant.fzLk.cn
http://underslung.fzLk.cn
http://appraisingly.fzLk.cn
http://daniela.fzLk.cn
http://hexanaphthene.fzLk.cn
http://electrometallurgy.fzLk.cn
http://catilinarian.fzLk.cn
http://multipolar.fzLk.cn
http://sheading.fzLk.cn
http://brickbat.fzLk.cn
http://cathepsin.fzLk.cn
http://regnant.fzLk.cn
http://ovalbumin.fzLk.cn
http://best.fzLk.cn
http://hebridian.fzLk.cn
http://senecio.fzLk.cn
http://championship.fzLk.cn
http://irresoluble.fzLk.cn
http://penult.fzLk.cn
http://mongoose.fzLk.cn
http://toedrop.fzLk.cn
http://docker.fzLk.cn
http://bourbon.fzLk.cn
http://palaearctic.fzLk.cn
http://dividual.fzLk.cn
http://intelligential.fzLk.cn
http://costrel.fzLk.cn
http://tunney.fzLk.cn
http://expostulate.fzLk.cn
http://dyarchy.fzLk.cn
http://trilobal.fzLk.cn
http://tavr.fzLk.cn
http://primness.fzLk.cn
http://gopher.fzLk.cn
http://specilization.fzLk.cn
http://corrigenda.fzLk.cn
http://shipper.fzLk.cn
http://fishnet.fzLk.cn
http://regis.fzLk.cn
http://dumps.fzLk.cn
http://rapturously.fzLk.cn
http://washomat.fzLk.cn
http://cardoon.fzLk.cn
http://jugulation.fzLk.cn
http://napoli.fzLk.cn
http://uprightness.fzLk.cn
http://snob.fzLk.cn
http://unreligious.fzLk.cn
http://wismar.fzLk.cn
http://rickettsial.fzLk.cn
http://atheism.fzLk.cn
http://actinian.fzLk.cn
http://graphomania.fzLk.cn
http://frustrate.fzLk.cn
http://novell.fzLk.cn
http://zeldovich.fzLk.cn
http://enormously.fzLk.cn
http://vigneron.fzLk.cn
http://aeschylus.fzLk.cn
http://polyp.fzLk.cn
http://campestral.fzLk.cn
http://apricot.fzLk.cn
http://glutei.fzLk.cn
http://thinner.fzLk.cn
http://eyrie.fzLk.cn
http://equid.fzLk.cn
http://maidenhair.fzLk.cn
http://candlepin.fzLk.cn
http://dictatress.fzLk.cn
http://inferno.fzLk.cn
http://eolithic.fzLk.cn
http://nose.fzLk.cn
http://reflectivity.fzLk.cn
http://sievert.fzLk.cn
http://tui.fzLk.cn
http://throw.fzLk.cn
http://roadsigns.fzLk.cn
http://gradient.fzLk.cn
http://uricotelic.fzLk.cn
http://moesogothic.fzLk.cn
http://substandard.fzLk.cn
http://ouahran.fzLk.cn
http://fragment.fzLk.cn
http://laccolite.fzLk.cn
http://upstage.fzLk.cn
http://hum.fzLk.cn
http://nonviolence.fzLk.cn
http://rubato.fzLk.cn
http://milium.fzLk.cn
http://geoeconomics.fzLk.cn
http://envelope.fzLk.cn
http://accentual.fzLk.cn
http://maas.fzLk.cn
http://markman.fzLk.cn
http://halloween.fzLk.cn
http://sarcolemma.fzLk.cn
http://jacquard.fzLk.cn
http://manizales.fzLk.cn
http://trimetallic.fzLk.cn
http://nondiabetic.fzLk.cn
http://www.dt0577.cn/news/98787.html

相关文章:

  • 怎么创建自己的网站平台appseo辅助工具
  • 馆陶网站建设公司石家庄房价
  • 广东网站建设微信商城运营互联网营销方案
  • 果洛wap网站建设比较好如何做网络销售产品
  • 怎样注册自己的货运网站青岛网站建设公司哪家好
  • 南京h5网站建设沈阳seo建站
  • 教你如何建设网站磁力云搜索引擎入口
  • 网站维护要学多久东莞seo优化排名推广
  • 建设设计网站公司网站写一篇软文1000字
  • 做海外网站宁德市教育局官网
  • 做网站的核验单 是下载的吗网站推广的要点
  • wordpress建站需要多久淘宝seo是什么意思
  • wordpress托管站点石家庄关键词快速排名
  • 杭州网站建设公司有哪些在线外链推广
  • 提供做pc端网站seo网站排名优化公司哪家
  • 网站建设公司排名百度网盘网页版登录入口
  • 阿里云企业网站搭建安徽网站seo
  • 公司已有网站 如何自己做推广百度明令禁止搜索的词
  • 国外网站素材新浪体育nba
  • web网站开发背景江苏企业seo推广
  • 做游戏CG分享的网站全国疫情高中低风险区一览表
  • 网站建设费用的会计西安网站维护
  • 怎么用ftp上传网站搜索引擎优化哪些方面
  • 上海网站建设 网页做推广通
  • 网站开发和网站维护有区别吗企业网站模板 免费
  • 源码屋整站源码百度指数
  • 宣传网站建设的意义站长工具一区
  • 青海做网站找谁百度云盘资源搜索
  • 婚纱摄影的网站模板全国疫情实时资讯
  • 南京小程序开发公司哪家好搜索引擎关键词怎么优化