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

如何做网站webstorm长沙在线网站的目标客户

如何做网站webstorm,长沙在线网站的目标客户,重庆住建委官网查询系统,舟山做网站目录 一、定时器简介1.1 Timer类1.2 使用案例 二、实现简易定时器2.1 MyTimerTask类2.2 实现schedule方法2.3 构造方法2.4 总代码2.5 测试 一、定时器简介 定时器:就相当于一个闹钟,当我们定的时间到了,那么就执行一些逻辑。 1.1 Timer类 …

目录

  • 一、定时器简介
    • 1.1 Timer类
    • 1.2 使用案例
  • 二、实现简易定时器
    • 2.1 MyTimerTask类
    • 2.2 实现schedule方法
    • 2.3 构造方法
    • 2.4 总代码
    • 2.5 测试

一、定时器简介

定时器:就相当于一个闹钟,当我们定的时间到了,那么就执行一些逻辑。

1.1 Timer类

Java的标准库中提供了在java.util包下的Timer类作为定时器。
有如下的构造方法:
四种:

  1. timer() 无参构造;
  2. timer(boolean isDaemon) 创建的线程都是后台线程;
  3. timer(String name) 给定时器中创建的线程名字;
  4. timer(String name, boolean isDaemon) 创建的线程都是后台线程,也给定时器中创建的线程名字。

在Timer类中的核心方法是schedule方法。

  1. schedule(Timer task, Date time) 到达time时刻后执行task任务;
  2. schedule(Timer task, Date firstTime, long period) 到达time时刻后重复执行task任务,每次相隔period时间;
  3. schedule(Timer task, long delay) 在delay时间后执行task任务;
  4. schedule(Timer task, long delay, long period) 在delay时间后重复执行task任务,每次相隔period时间;
  5. scheduleAtFixedRate(Timer task, Date firstTime, long period) 到达time时刻后重复执行task任务,每次执行period时间;
  6. scheduleAtFixedRate(Timer task, long delay, long period) 在delay时间后重复执行task任务,每次执行period时间;

schedule的第一个参数是TimerTask类,这是一个实现了Runnable接口的抽象类。

1.2 使用案例

我们使用schedule方法来打印不同时间执行不同内容。

import java.util.Timer;
import java.util.TimerTask;public class Demo {public static void main(String[] args) {Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("3000ms后执行");}},3000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("1000ms后执行");}},1000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("2000ms后执行");}},2000);}
}

结果如下:会按照等待时间由小到大打印内容,并且执行完之后并不会结束,这是因为这些线程是前台线程。

二、实现简易定时器

自己实现的定时器主要要考虑下面几个内容:

  1. 设计一个类表示任务,对应TimerTask类;
  2. 使用优先级队列来组织多个任务,每次根节点都是等待时间最短的任务;
  3. 实现schedule方法,把任务添加到队列中;
  4. 额外创建一个线程,负责执行队列中的任务,根据时间来执行(即判断是否到了该执行的时间了)。

2.1 MyTimerTask类

这个类中需要:

  • 将要执行的任务,和任务要执行的时刻记录下来,
  • 并且这个任务还要有通过时刻比较得方法(即实现Comparator接口,重写CompareTo方法),便于后面存储进优先级队列。

代码:

class MyTimerTask implements Comparable<MyTimerTask>{//记录任务private Runnable task = null;//记录执行任务的时刻private long current = 0;public MyTimerTask(Runnable task, long current) {this.task = task;this.current = current;}public Runnable getTask() {return task;}public long getCurrent() {return current;}@Overridepublic int compareTo(MyTimerTask o) {return (int)(this.current - o.current);}
}

2.2 实现schedule方法

我们实现schedule方法:

  • 只需要将当前的任务传入队列中即可。
  • 将参数Runnable的任务和时刻用来创建MyTimerTask类,在入队即可。
  • 我们还要使用notify为后面的线程中因为队列为空调用wait进入阻塞状态提供唤醒。

代码:

private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();public void schedule(Runnable task, long delay) {synchronized (this) {MyTimerTask myTimerTask = new MyTimerTask(task, System.currentTimeMillis() + delay);queue.offer(myTimerTask);this.notify();}}

2.3 构造方法

在构造方法中额外创建一个线程,负责执行队列中的任务,根据时间来执行(即判断是否到了该执行的时间了)。

  • 我们在最外层使用一层死循环来不断去读取队列中的任务。
  • 如果队列空了,那么我们就出这次循环,但是如果使用continue的话,还是会在循环的去判断直到队列不为空为止。这样的消耗很高,我们可以使用wait等待schedule方法入队列后;来唤醒这个线程。
  • 如果没有到达执行时间,我们也要出这次循环,但是使用continue也会导致在从现在这个时刻到执行时刻之间一直进行无意义的执行上面的代码,消耗很高,我们这里直接使用带参数的wait方法等待还需要的时间即可。
  • 到达执行时间直接执行任务并出队列即可。
  • 最后不要忘记启动这个线程。

代码:

public MyTimer() {Thread thread = new Thread(()-> {try {while(true) {  //循环拿任务,直到任务队列为空synchronized (this) {while (queue.isEmpty()) {  //任务队列为空this.wait();}MyTimerTask task = queue.peek();if(task.getCurrent() > System.currentTimeMillis()) { //没到执行时间 this.wait(task.getCurrent() - System.currentTimeMillis());} else {task.run();queue.poll();}}}} catch (InterruptedException e) {e.printStackTrace();}});thread.start();}

2.4 总代码

总代码如下:

class MyTimerTask implements Comparable<MyTimerTask>{//记录任务private Runnable task = null;//记录执行任务的时刻private long current = 0;public MyTimerTask(Runnable task, long current) {this.task = task;this.current = current;}public Runnable getTask() {return task;}public long getCurrent() {return current;}@Overridepublic int compareTo(MyTimerTask o) {return (int)(this.current - o.current);}public void run() {task.run();}}class MyTimer {private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();public void schedule(Runnable task, long delay) {synchronized (this) {MyTimerTask myTimerTask = new MyTimerTask(task, System.currentTimeMillis() + delay);queue.offer(myTimerTask);this.notify();}}public MyTimer() {Thread thread = new Thread(()-> {try {while(true) {  //循环拿任务,直到任务队列为空synchronized (this) {while (queue.isEmpty()) {  //任务队列为空this.wait();}MyTimerTask task = queue.peek();if(task.getCurrent() > System.currentTimeMillis()) { //没到执行时间this.wait(task.getCurrent() - System.currentTimeMillis());} else {task.run();queue.poll();}}}} catch (InterruptedException e) {e.printStackTrace();}});thread.start();}
}

2.5 测试

如果在main中执行下面这样的代码,也使用schedule方法来打印不同时间执行不同内容,会与上面使用案例的结果一样。

public static void main(String[] args) {MyTimer timer = new MyTimer();timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("3000ms后执行");}},3000);timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("1000ms后执行");}},1000);timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("2000ms后执行");}},2000);}

结果如下:会按照等待时间由小到大打印内容,并且执行完之后并不会结束,这是因为这些线程是前台线程。

http://www.hkea.cn/news/406826/

相关文章:

  • 网站怎么做更新吗如何建立网页
  • 国外建设工程招聘信息网站tool站长工具
  • 专业做相册书的网站电商网站建设制作
  • 银川网站开发公司电话东莞网
  • 环境保护局网站管理制度建设百度指数的主要功能有
  • 安装wordpress提示500错误关键词优化的策略有哪些
  • 企业网站建设公司排名深圳高端seo公司助力企业
  • 做网站套餐网站seo
  • 网站上的代码网页怎么做的下载百度软件
  • 网站功能模块建设搜狗推广
  • 网站做推广有用吗网站页面设计
  • 做简报的网站广州搜发网络科技有限公司
  • 南乐县住房和城乡建设局网站制作网站的步骤是什么
  • 金华做网站最专业的公司搜易网提供的技术服务
  • wordpress适合门户网站吗怎么营销自己的产品
  • 常用的网站类型有哪些seo优化专员编辑
  • 网站专题框架怎么做海阳seo排名
  • 手机网站代码下载黄页网站推广服务
  • 做网站前端多少钱在线bt种子
  • wordpress+模版+推荐专业网站seo推广
  • 浦项建设公司员工网站2023免费推广入口
  • 如何查询某个网站的设计公司最新推广注册app拿佣金
  • 八宝山做网站公司打广告
  • wordpress vip查看插件南宁seo费用服务
  • 建站之星模板怎么设置手机如何做网站
  • 上海公司网站制作价格西安百度关键词排名服务
  • 长沙网页制作开发公司aso优化方案
  • 深圳罗湖网站制作成人电脑基础培训班
  • 无锡网站制作咨询深圳网站设计十年乐云seo
  • 大连城市建设网站seo优化顾问服务阿亮