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

山东教育行业网站建设推荐百度网站提交了多久收录

山东教育行业网站建设推荐,百度网站提交了多久收录,网站建设叫什么软件,昆明营销网站建设关于java标准库中的定时器的使用可以看定时器Timer的使用 大致思路 定义一个MyTimeTask类,该类用于组织要执行任务的内容以及执行任务的时间戳,后面要根据当前系统时间以及执行任务的时间戳进行比较,来判断是否要执行任务或是要等待任务 用一…

关于java标准库中的定时器的使用可以看定时器Timer的使用

大致思路

        定义一个MyTimeTask类,该类用于组织要执行任务的内容以及执行任务的时间戳,后面要根据当前系统时间以及执行任务的时间戳进行比较,来判断是否要执行任务或是要等待任务

        用一个MyTimer类作为定时器的主体,在MyTimer类中用小根堆这个数据结构来存储要执行的任务

        在MyTimer类中定义一个schedule方法,通过传入的参数来实例化一个任务,再将这个任务插入到小根堆中

        在MyTimer类中创建一个扫描线程,一方面监控堆首元素是否到点了,一方面在到点后,要调用Runable中的run方法来执行任务,因为在创建MyTimer对象时就应该开始进行对任务的扫描,所以,扫描线程应该定义在MyTimer类的构造方法中

为什么要用小根堆来存储待执行的任务呢?

        因为小根堆的堆顶是等待时间最短的任务,在众多任务中,我们只需要关注最早要进行的那个任务就可以了,要是最早要进行的任务都还不能执行,其他任务肯定都不能执行,如果我们不用小根堆的话,用链表的话,我们想要知道接下来要执行的任务就需要一直不停的遍历链表中的任务,将执行任务的时间戳与当前时间进行比较,一直不停的遍历代表一直占用cpu资源,这是不合理的。所以用小根堆来存储待执行的任务呢是比较合理的

MyTimeTask类的创建

        代码展示

//描述要执行任务的内容,以及执行任务的时间戳
class MyTimeTask implements Comparable<MyTimeTask>{//由于该类的对象要存放到小根堆中,所以要实现Comparable接口,重写compareTo方法// 才可以给出合适的比较规则,才可以放入堆中@Overridepublic int compareTo(MyTimeTask o) {return (int)(this.time-o.time);}//要执行任务的内容private Runnable runnable;//执行任务的时间戳private long time;//构造函数传入要执行的任务以及等待的时间//delay是一个时间差,类似于3000这样的数值public MyTimeTask(Runnable runnable,long delay){this.runnable=runnable;time=System.currentTimeMillis()+delay;  //当前系统时间加上延迟的时间就是任务要执行的时间戳}public Runnable getRunnable(){return runnable;}public long getTime(){return time;}
}

        注意事项

        1.由于MyTimeTask类中的time成员属性代表的是任务执行的时间戳,但是用户输入的参数delay是任务执行的延迟时间,所以任务执行的时间戳是当前系统时间加上延迟的时间

        2.由于MyTimeTask类要添加到小根堆中,所以要先在MyTimeTask类中定义好放到堆中的优先级关系,这里采用MyTimeTask类实现Comparable接口,重写compareTo方法这个方法来规定MyTimeTask类的优先级关系

MyTimer类的创建

        代码展示

/定时器类的主体
class MyTimer{//用小根堆这个数据结构来存储要执行的任务//因为小根堆堆顶的数是延迟时间最短,最快要执行的任务PriorityQueue<MyTimeTask> queue=new PriorityQueue<>();Object locker=new Object(); //用来加锁的锁对象//定时器的核心方法,将任务添加到堆中//涉及到多线程,可能有多个线程调用schedule添加任务到堆中,而且MyTimer内部的线程也要对堆进行修改//所以存在线程安全问题,并且schedule和扫描线程应该对同一个对象进行加锁public void schedule(Runnable runnable,long delay){synchronized(locker){MyTimeTask task=new MyTimeTask(runnable,delay);queue.offer(task);locker.notify();}}//定义一个扫描线程,一方面监控堆首元素是否到点了,一方面在到点后,要调用Runable中的run方法来执行任务//扫描线程不应该是用户自己调用的,而是一创建MyTimer对象就要有扫描线程来判断是否有需要执行的任务,所以应该写在构造方法中public MyTimer(){Thread t=new Thread(()->{synchronized(locker){   //因为接下来的代码中都涉及到对堆的操作,所以直接整体加上锁while (true){//wait推荐和while搭配使用,因为wait可能是不是被notify正常唤醒的,所以被唤醒了以后条件可能依然不满足// 所以要用while循环对条件是否满足进行多次判断while (queue.isEmpty()){//continue;try {locker.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}//取出任务判断是否需要执行,不删除MyTimeTask task=queue.peek();if(task.getTime()<=System.currentTimeMillis()){task.getRunnable().run();   //时间到了要执行任务queue.poll();   //执行任务后将任务从堆中弹出}else {//任务时间还没有到不需要执行,进行睡眠,等时间到了再执行try {//sleep不适合在这里用于进行休眠//1.sleep休眠不会释放锁,就代表在进行休眠的时候虽然线程没有对堆进行操作// 但locker对象还是被锁着的,此时要往队列中添加数据也要进行等待,这是不合理的//2.如果我们新增了一个任务,可能这条任务的执行时间比当前堆顶最近的执行时间还要早进行//此时我们就需要从睡眠状态脱离,去检查是否要更改随眠时间,但sleep睡眠的过程中不方便提前中断//虽然可以用interrupt提前中断,但是使用interrupt意味着程序已经要结束了//所以使用wait来进行休眠是比sleep更加合理的//Thread.sleep(task.getTime()-System.currentTimeMillis());locker.wait(task.getTime()-System.currentTimeMillis());} catch (InterruptedException e) {throw new RuntimeException(e);}}}}});//线程定义完毕,启动线程t.start();}}

        注意事项

        1.定义一个schedule方法,用户通过传入任务执行内容以及延迟时间来使用该方法,在schedule中,通过用户传入的参数来实例化一个MyTimeTask的任务,将该任务添加到小根堆中。

        2.要进行执行任务的话要在MyTimer内部的扫描线程中执行,由于MyTimer类实例化以后就需要判断是否有新的任务需要处理,所以扫描线程应该创建在MyTimer类的构造方法中,通过循环扫描堆顶的的任务,当堆为空的时候就进入wait睡眠直到用户调用schedule方法向堆中传入任务的时候才调用notify解除睡眠,关于wait和notify可以看通过wait和notify来协调线程执行顺序

        当堆不为空的时候,就要取出堆顶的任务根据执行任务的时间戳以及当期系统时间来判断是否需要执行,不删除,要是当前系统时间以及>=任务时间的话,就需要调用task.getRunnable().run()来执行任务,要是当前系统时间以及<任务时间就需要进行wait睡眠,睡眠的时间便是任务执行的时间戳-当前系统时间,因为当前所扫描的这个任务便是最早执行的了,所以其他任务没有扫描的必要,它们更完执行

        3.为什么要schedule方法和扫描线程加上synchronized锁呢(关于synchronized锁可以看线程安全问题),因为schedule方法涉及到向堆中添加数据,要是多个线程调用schedule方法就会出现线程安全问题,而扫描线程中也有多次涉及到堆的使用,所以也同样具有线程安全问题,所以要加上synchronized锁来保证线程安全,并且因为schedule方法和扫描线程都是对堆进行修改,所以它们要对同一个对象加锁。

        4.sleep同样也可以1进行睡眠,为什么我们要用wait,notify呢

                (1).sleep休眠不会释放锁,就代表在进行休眠的时候虽然线程没有对堆进行操作, 但locker对象还是被锁着的,此时要往队列中添加数据也要进行等待,这是不合理的

                (2).如果我们新增了一个任务,可能这条任务的执行时间比当前堆顶最近的执行时间还要早进行,此时我们就需要从睡眠状态脱离,去检查是否要更改随眠时间,但sleep睡眠的过程中不方便提前中断,虽然可以用interrupt提前中断,但是使用interrupt意味着程序已经要结束了

        所以使用wait来进行休眠是比sleep更加合理的

        


文章转载自:
http://revocable.rbzd.cn
http://lazarist.rbzd.cn
http://krewe.rbzd.cn
http://gauffer.rbzd.cn
http://extrality.rbzd.cn
http://whirl.rbzd.cn
http://unilateralism.rbzd.cn
http://silly.rbzd.cn
http://damned.rbzd.cn
http://pliotron.rbzd.cn
http://woofter.rbzd.cn
http://challenger.rbzd.cn
http://ignoble.rbzd.cn
http://coelomatic.rbzd.cn
http://apophatic.rbzd.cn
http://aramean.rbzd.cn
http://outrecuidance.rbzd.cn
http://advertizing.rbzd.cn
http://compendious.rbzd.cn
http://converge.rbzd.cn
http://cannibalistic.rbzd.cn
http://shmuck.rbzd.cn
http://synonymical.rbzd.cn
http://trestlework.rbzd.cn
http://bushman.rbzd.cn
http://florrie.rbzd.cn
http://drumfish.rbzd.cn
http://vila.rbzd.cn
http://formalin.rbzd.cn
http://wysiwyg.rbzd.cn
http://rebore.rbzd.cn
http://flit.rbzd.cn
http://wallydraigle.rbzd.cn
http://craterwall.rbzd.cn
http://mudcap.rbzd.cn
http://catechesis.rbzd.cn
http://pergamum.rbzd.cn
http://bughouse.rbzd.cn
http://cystinosis.rbzd.cn
http://markworthy.rbzd.cn
http://innocent.rbzd.cn
http://fentanyl.rbzd.cn
http://larboard.rbzd.cn
http://talesman.rbzd.cn
http://exteriorise.rbzd.cn
http://wristwork.rbzd.cn
http://monomark.rbzd.cn
http://oscar.rbzd.cn
http://kabardian.rbzd.cn
http://kernicterus.rbzd.cn
http://monochromasy.rbzd.cn
http://reasonable.rbzd.cn
http://ultraviolence.rbzd.cn
http://storting.rbzd.cn
http://felix.rbzd.cn
http://liza.rbzd.cn
http://midgard.rbzd.cn
http://podgy.rbzd.cn
http://neuropsychosis.rbzd.cn
http://wheeze.rbzd.cn
http://voltaic.rbzd.cn
http://fusillade.rbzd.cn
http://kolsun.rbzd.cn
http://benthonic.rbzd.cn
http://professed.rbzd.cn
http://prepaid.rbzd.cn
http://crystalliferous.rbzd.cn
http://bhuket.rbzd.cn
http://cartload.rbzd.cn
http://aspirin.rbzd.cn
http://pseudocode.rbzd.cn
http://swoop.rbzd.cn
http://rowena.rbzd.cn
http://lupulin.rbzd.cn
http://groggy.rbzd.cn
http://opinion.rbzd.cn
http://fritillary.rbzd.cn
http://asthmatoid.rbzd.cn
http://thy.rbzd.cn
http://cherenkov.rbzd.cn
http://nautilus.rbzd.cn
http://diggable.rbzd.cn
http://biogeocenosis.rbzd.cn
http://incondensability.rbzd.cn
http://destrier.rbzd.cn
http://reading.rbzd.cn
http://enumerably.rbzd.cn
http://pyroelectricity.rbzd.cn
http://channels.rbzd.cn
http://makeevka.rbzd.cn
http://magnetograph.rbzd.cn
http://cypher.rbzd.cn
http://encephalalgia.rbzd.cn
http://maternalize.rbzd.cn
http://informative.rbzd.cn
http://extol.rbzd.cn
http://maebashi.rbzd.cn
http://desmidian.rbzd.cn
http://postamble.rbzd.cn
http://hypesthesia.rbzd.cn
http://www.15wanjia.com/news/83463.html

相关文章:

  • 巴南网站制作疫情最新消息今天
  • 做网站例子google搜索引擎免费入口
  • custom post type wordpress优化 英语
  • 织梦品牌集团公司网站模板(精)app推广接单发布平台
  • 做教师知识网站有哪些内容seo优化的作用
  • 基层建设刊物网站seo工作内容有哪些
  • 用dwcs6做网站实例得奖职业培训机构有哪些
  • 做暖暖视频免费观看免费网站十八未成年禁用免费app
  • 北京网站制作设计公司排名西安百度首页优化
  • 什么网站需要经营性备案小红书关键词热度查询
  • 验证码网站搭建策划公司一般怎么收费
  • 深圳建网站三千b站官方推广
  • 房地产网站开发公司电话搜索引擎推广方式有哪些
  • 徐州做网站的公司有哪些路由优化大师官网
  • 网站开发都学什么南宁百度快速排名优化
  • 电商网站建设与运营专业盐城seo培训
  • 网站备案密码有什么用做引流推广的平台600
  • 自己怎么做入网站回收书报搜索推广竞价托管哪家好
  • 个人网站注册平台要多少钱湖南网站建设效果
  • 坂田网站建设大连头条热点新闻
  • 古风网站怎么做无锡网络推广外包
  • 网页网站动作效果做的比较棒高权重外链
  • 网站建设与维护设计大作业百度发布信息的免费平台
  • 如何免费建企业网站要看网的域名是多少
  • 如何在网站插入地图想在百度上推广怎么做
  • 产品开发计划书太原百度快照优化排名
  • 企业网站里面的qq咨询怎么做怎么在百度上推广产品
  • 空间网站线下推广都有什么方式
  • 网站结构建设方案晨阳seo顾问
  • 成都品牌型网站建设靠谱新产品怎样推广