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

南京网站优化步骤手机网页前端开发

南京网站优化步骤,手机网页前端开发,免费网络营销课程,西宁网站运营公司定时器是日常开发中很常见的组件,定时器大家可能不知道是干什么的,但是定时炸弹肯定都听过,定个时间,过一段时间后bomb!!!爆炸 定时器的逻辑和这个一样,约定一个时间,这…

定时器是日常开发中很常见的组件,定时器大家可能不知道是干什么的,但是定时炸弹肯定都听过,定个时间,过一段时间后bomb!!!爆炸

定时器的逻辑和这个一样,约定一个时间,这个时间到达之后,执行某个代码逻辑;定时器的常见场景有网络通信,定时邮件发送等等。

计算机网络中的“超时重传”就用到了定时器。当客户端向服务器发送消息时,服务器可能由于某些问题一直不回复,此时该怎么办呢?肯定不能无限的等,需要有一个最大的期限,当到达这个最大期限时,该放弃呢?还是重传呢?或者想别的解决办法,这时就用到了定时器。

内部库Timer

当然,不光要学会怎么使用内部库提供的定时器,我们还要自己手写一个定时器出来。

怎么写呢?

1、需要一个线程,不断扫描是否有任务到达时间,可以执行了。

2、需要一个数据结构,存储所有的任务。

3、还需要创建一个类,通过类的对象来描述一个任务(至少要包含做什么和时间)。

那么又出现一个问题,该使用什么数据结构呢?

用数组吗?不行,用数组每次扫描都要遍历所有任务,时间开销太大;

想想我们学过的数据结构,每次执行时间最小的,是的,没错,就是它,它就是--优先级队列!

优先级队列每次放入元素时都会更新顺序,保证时间最小的一定在最前面,因为我们每次可以执行的一定是时间最小的,之后的元素都不需要搜索,所以时间复杂度是O(1)。

代码如下:

package Thread;import java.util.PriorityQueue;
import java.util.Timer;
import java.util.TimerTask;class MyTimerTask implements Comparable<MyTimerTask> {private Runnable runnable;//要有一个要执行的任务private long time;//还要有一个执行任务的时间(这里是绝对时间)public MyTimerTask(Runnable runnable,long delay){this.runnable = runnable;this.time = System.currentTimeMillis() + delay;}@Overridepublic int compareTo(MyTimerTask o){return (int)(this.time - o.time);//这样的写法,就是让队首元素是最小时间的值}public long getTime(){return time;}public Runnable getRunnable(){return runnable;}
}class MyTimer{private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();private Object locker = new Object();public void schedule(Runnable runnable,long delay){synchronized (locker){queue.offer(new MyTimerTask(runnable,delay));locker.notify();}}public MyTimer(){Thread t = new Thread(() -> {while(true){try{synchronized (locker){while(queue.isEmpty()){locker.wait();}MyTimerTask task = queue.peek();long curTime = System.currentTimeMillis();if(curTime >= task.getTime()){task.getRunnable().run();queue.poll();}else{locker.wait(task.getTime() - curTime);}}} catch (InterruptedException e) {e.printStackTrace();}}});t.start();}
}public class mtime {public static void main(String[] args) {MyTimer timer = new MyTimer();timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("3000");}},3000);timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("2000");}},2000);timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("1000");}},1000);System.out.println("程序开始执行");}
}

这里为什么要用wait呢?用sleep可以吗?

答案是不可以!

当我们向队列中插入元素时,会调用notify方法,这里使用wait是为了当新插入队列中的元素的时间比当前队头的元素的时间小时,就需要进行更新,重新判定一下最早的任务以及此处的等待时间。

http://www.yayakq.cn/news/877314/

相关文章:

  • 网站注册费网站上的支付接口怎么做
  • 建个网站做网络推广要花多少钱住房与城乡建设部
  • 网站模板生成wordpress建站主机
  • 成都装修网站制作网站开发容易找工作吗
  • 百汇游戏网站开发商二维码生成器微信小程序
  • 西部虚拟主机网站后台不能访问网站建设
  • 京山网站建设网站框架怎么做的
  • 宣传部网站建设策划书网站优化排名查询
  • 网站设计中的js是什么链接点击量软件
  • 重庆企业网站定制开发公司江苏省建设厅网站培训网
  • 福田建网站外包防红跳转短网址生成
  • 怎么看一个网站是html5常德市网站建设
  • 传统网站建设wordpress 小程序源码
  • 网络绿化网站建设哪家专业东莞市住房建设网站
  • 网站如何做标题优化沈阳网站建设索王道下拉
  • 百度网址大全电脑版旧版本深圳关键词优化
  • 江苏海宏建设工程有限公司网站专业做数据的网站
  • 树莓派做网站什么是电商平台怎么加入电商平台
  • 微网站建设的现状地方电商网站
  • 网站站长在哪登陆后台江门网络科技有限公司
  • 家居企业网站建设资讯上海杨浦区网站建设
  • 用模板网站做h5宣传页多少钱云南网app下载
  • 学校网站建设汇报ppt南宁网红景点
  • 上海哪家公司做网站动画视频制作软件app免费
  • 用dw做淘宝网站天津建设厅官方网站
  • 昆明专业网站设计公司幸运28网站建设
  • 甘肃省建设部网站平面设计正规兼职平台
  • 西安做网站的公司电话用手机搭建wordpress
  • 浙江网站建设售后保障资溪县建设局网站
  • 网设台州关键词优化哪家好