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

国际网站怎么建设个人网站建设一般流程

国际网站怎么建设,个人网站建设一般流程,银川网站建设就找湖海,wordpress前台注册目录 一. 什么是“定时器” 二. 标准库的定时器 三. 定时器的实现 MyTimer 3.1 分析思路 1. 创建执行任务的类。 2. 管理任务 3. 执行任务 3.2 线程安全问题 四. 拓展 一. 什么是“定时器” 定时器是软件开发中的一个重要组件#xff0c;类似于一个“闹钟”#xff0…目录 一. 什么是“定时器” 二. 标准库的定时器  三. 定时器的实现 MyTimer 3.1 分析思路 1. 创建执行任务的类。 2. 管理任务 3. 执行任务 3.2 线程安全问题 四. 拓展 一. 什么是“定时器” 定时器是软件开发中的一个重要组件类似于一个“闹钟”达到一个设定的时间之后就执行某个指定好的代码。 定时器是一种实际开发中非常常用的组件比如网络通信中如果对方 500ms 内没有返回数据则断开连接尝试重连比如一个 Map希望里面的某个 key 在 3s 之后过期(自动删除)    类似于这样的场景就需要用到定时器。 二. 标准库的定时器  Timer类是一个线程安全的工具类用于在指定的时间后执行或定期执行任务。它基于绝对时间而不是基于固定时间间隔调度任务。Timer类比较简单适用于简单的定时任务但不适合处理复杂的调度需求。ScheduleExecutorService 提供了更灵活的线程管理功能适用于复杂的调度场景并且能够处理异常 标准库中java.util.Timer Timer 类的核心方法为 scheduleschedule 包含两个参数第一个参数指定即将要执行的任务代码第二个参数指定多长时间之后执行单位为毫秒 import java.util.Timer; import java.util.TimerTask;public class Timer1 {public static void main(String[] args) throws InterruptedException {Timer timer1 new Timer();timer1.schedule(new TimerTask() {Overridepublic void run() {System.out.println(hello delay 1000);}},1000);timer1.schedule(new TimerTask() {Overridepublic void run() {System.out.println(hello delay 2000);}},2000);timer1.schedule(new TimerTask() {Overridepublic void run() {System.out.println(hello delay 3000);}},3000);// 等待提交的任务执行完毕后调用 cancel 便可结束进程Thread.sleep(4000);timer1.cancel();} }三. 定时器的实现 MyTimer 3.1 分析思路 对于定时器来说 创建描述一个要执行的任务任务内容 执行任务时间的类管理多个任务通过一定的数据结构把多个任务存起来有专门的线程执行这里的任务 1. 创建执行任务的类。 我们在调用 schedule 时传的是延迟时间 “delay” 值。但是描述任务时不太建议使用 delay 表示最好使用 “绝对时间”时间戳来表示~~ public class MyTimerTask implements ComparableMyTimerTask{//此处这里的 time通过毫秒时间戳表示这个任务具体啥时候执行private long time;private Runnable runnable;public MyTimerTask(Runnable runnable,long delay){this.time System.currentTimeMillis() delay;this.runnable runnable;}public void run(){runnable.run();}public long getTime(){return time;}Overridepublic int compareTo(MyTimerTask o) {//比如当前时间是 10:30任务时间是 12:00不应该执行//如果当前时间是 10:30任务时间是 10:29应该执行//谁减去谁可以通过实验判断return (int) (this.time - o.time);} } 2. 管理任务 使用 List 管理任务不是一个好选择——因为后续执行列表中的任务时就需要依次遍历每个元素执行完毕后还需要把对应的任务从 List 中删除掉。 我们需要按照时间来执行这里的任务。只要能够确定所有任务中时间最早的任务判定它是否到该执行的时间即可。如果时间最早的任务还没到执行时间其他任务更不可能到时间了。因此我们使用堆数据结构涉及到队列中的元素排序时考虑堆——PriorityQueueMyTimerTask优先级队列管理元素时需要有比较方法才能排序存储。因此在实现 MyTimerTask 类时要继承 ComparableMyTimerTask 接口重写 compareTo比较方法 3. 执行任务 当创建 MyTimer 对象调用无参构造方法时便创建一个线程循环执行从队列中取出任务的操作取出队列中 “绝对时间” 最早的任务——如果当前时间 此任务的时间已经到达此任务的执行时间便可调用run方法执行执行完毕后从队列中删除 如果当前时间  此任务的时间没到此任务的执行时间则继续执行循环。所以在实现 MyTimerTask 类时要有 run方法 和 getTime方法 除此之外 还需要有 schedule 方法添加任务。 import java.util.PriorityQueue;public class MyTimer {private final PriorityQueueMyTimerTask queue new PriorityQueue();public MyTimer() {Thread t new Thread(() - {while (true){if(queue.isEmpty()){ continue;}MyTimerTask task queue.peek();//判断是否满足执行条件if (System.currentTimeMillis() task.getTime()) {task.run();//执行完后便从队列中删除queue.poll();}else{continue;}}});t.start();}public void schedule(Runnable runnable, long delay) {MyTimerTask task new MyTimerTask(runnable, delay);queue.offer(task);} }3.2 线程安全问题 当前这个代码是没有考虑线程安全问题的。 PriorityQueue 这个类自身是非线程安全的并且又是多个线程来进行操作一定存在线程安全问题的风险。因此要在涉及队列相关操作的地方加锁。 import java.util.PriorityQueue;public class MyTimer {private final PriorityQueueMyTimerTask queue new PriorityQueue();private final Object locker new Object();public MyTimer() {Thread t new Thread(() - {while (true){synchronized(locker){if(queue.isEmpty()){ continue;}MyTimerTask task queue.peek();if (System.currentTimeMillis() task.getTime()) {task.run();queue.poll();}else{continue;}}}});t.start();}public void schedule(Runnable runnable, long delay) {synchronized(locker){MyTimerTask task new MyTimerTask(runnable, delay);queue.offer(task);}} }但是加完锁以后又出现了线程安全问题。  1初始情况下如果队列中没有任何元素。此时就会在短时间内执行大量循环这样的执行是没有意义的导致“线程饿死”。 因此我们需要添加 wait 和 notify 机制队列为空时进行等待添加任务时就唤醒线程。 2假设队列中已经包含元素了并且当前时间是 10:45任务时间 12:00类似于我定了12:00的闹钟现在是 10:45。在判断任务是否满足执行条件时不满足就会一直循环相当于每隔一会儿就看一眼闹钟这样无意义的执行就一直占用着cpu资源导致 “线程饿死”。 因此我们需要添加一个有等待期限的 wait等待 1h15min 就会执行当到达任务执行时间wait 就结束了。如果在等待过程中又再次调用 schedule 方法也会唤醒这里的 wait进行新一轮的判断。 线程安全版 import java.util.PriorityQueue;public class MyTimer {private final PriorityQueueMyTimerTask queue new PriorityQueue();private final Object locker new Object();public MyTimer() {Thread t new Thread(() - {try {while (true) {synchronized (locker) {while (queue.isEmpty()) {//如果还没添加任务会不断循环执行判断出现线程饿死。//continue;//因此使用wait等待当添加任务后唤醒locker.wait();}MyTimerTask task queue.peek();if (System.currentTimeMillis() task.getTime()) {task.run();queue.poll();} else {//如果还没到任务执行时间依旧不断循环判断出现线程饿死。//continue;//因此使用有等待期限的 wait计算执行的时间与当前时间的差值//当添加新的任务后wait 被唤醒再进行新的判断locker.wait(task.getTime() - System.currentTimeMillis());}}}} catch (InterruptedException e) {e.printStackTrace();}});t.start();}public void schedule(Runnable runnable, long delay) {synchronized (locker){MyTimerTask task new MyTimerTask(runnable, delay);queue.offer(task);// 唤醒 waitlocker.notify();}} }* 能否将第二处的 wait 改为 sleep 呢 ——不能 不应该使用sleep可能存在以下情况      1在 sleep 阻塞1h15min 的过程中新来了一个时间更早的任务比如 11:30 要执行。如果使用 wait 每次新来的任务都会把 wait 唤醒重新设定 wait 的等待时间。而 sleep 不会被唤醒依旧在阻塞着.....      2sleep 休眠的时候不会释放锁。因此在休眠的时候就是“抱着锁”其他人想拿锁就拿不到了。 * PriorityQueue 是线程不安全的类能否使用 PriorityBlockingQueue 线程安全的阻塞队列呢——不能  如果使用线程安全的队列会导致代码中从 一把锁 变成 两把锁很容易出现死锁的情况比如持有和请求的情况并非100%一定出现但是需要程序员精心控制加锁顺序使得编写代码的复杂度提高了。如果通篇代码 只有一把锁就能更容易地解决问题 * 如果某个任务的执行时间过长怎么办  此处只有一个线程串行执行每一个任务。如果某个任务执行时间过长可能会影响到定时器的准确性特别是对于周期性任务使后续的任务被延迟——解决方案多创建几个这样的工作线程。 四. 拓展 业界实现定时器除了基于优先级队列的方式之外还有一种经典的实现方式——“时间轮” “时间轮” 是一种设计巧妙的数据结构通常用于高效处理大量的定时任务。它是定时器任务调度的一种优化方案尤其在需要调度大量短任务的场景中非常有效。时间轮的概念类似于钟表它将时间划分为固定数量的槽位每个槽位对应一个时间间隔用于存储该时间间隔内需要执行的任务。    这只是简单介绍不做过多讨论可自行查阅~~ 定时器特别重要也特别常用尤其是后端开发中和 “阻塞队列” 类似也会有专门服务器用来在分布式系统中实现定时器这样的效果。 hashmap -- redis阻塞队列 -- 消息队列定时器 -- 定时任务
http://www.w-s-a.com/news/778511/

相关文章:

  • 济南做网站创意服装品牌策划公司
  • 本地电脑做视频网站 外网连接不上软件商城源码
  • 足球直播网站怎么做crm系统介绍
  • 株洲网站建设联系方式东莞凤岗网站制作
  • 小纯洁网站开发如何注册域名
  • 网上做试卷的网站如何把刚做的网站被百度抓取到
  • 滕州网站建wordpress用户中心按钮不弹出
  • 清远新闻最新消息福建seo搜索引擎优化
  • 凡客建站网微信网站怎么做的
  • 网站建设费怎么写会计科目行业网站建设公司
  • 网站里的友情链接网站建设个人简历的网页
  • 佛山自助建站软件湖南seo优化推荐
  • 免费微信微网站模板下载不了优化人员配置
  • wordpress 导航网站主题画流程图的网站
  • 皮卡剧网站怎样做排名网
  • 网站开发 兼职哪个网站是做安全教育
  • 商品展示类网站怎么用群晖nas做网站
  • 长腿蜘蛛wordpresssem优化推广
  • 中国铁路建设监理协会官方网站深圳福田区怎么样
  • 互联网网站开发发展wordpress文章自定义栏目
  • 众筹网站平台建设工信部网站备案系统
  • 网站301重定向代码wordpress 加子目录
  • 淄博网站制作优化推广asp做学生信息网站
  • 海口招商建设有限公司网站淮安哪有专业做网站的公司
  • 喀什哪有做网站的国内正规seo网络推广
  • 网站设计初步规划公司网页打不开是什么原因
  • 深圳企业网站建设推广服务php做的商城网站设计论文
  • 韩雪冬网站手机网站开发 宽度
  • 奉贤专业做网站新手怎么做企业网站
  • 做网站用哪几个端口 比较好手机号网站源码