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

买了服务器不翻墙就用来 做网站seo快排技术教程

买了服务器不翻墙就用来 做网站,seo快排技术教程,品牌如何推广,网站建设专家选哪家目录 1.什么是定时器 2.计时器的使用 3.手搓定时器 3.1定义一个TimerTask类 3.2定义一个Timer类 3.3实现schedule方法 3.4实现Timer的构造方法 3.4.1随时随地查看优先级队列中是否有任务要执行 3.4.2获取队首任务,并判断是否到执行时间 3.4.3到达执行时间…

目录

1.什么是定时器

2.计时器的使用

3.手搓定时器

3.1定义一个TimerTask类

3.2定义一个Timer类

3.3实现schedule方法

3.4实现Timer的构造方法

3.4.1随时随地查看优先级队列中是否有任务要执行

3.4.2获取队首任务,并判断是否到执行时间

3.4.3到达执行时间执行任务

4.整体的一个代码:


                    ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

1.什么是定时器

在看警匪片时,经常会有匪徒在银行安装定时炸弹,而这里的定时炸弹就可以看成一个定时器,当设定的时间到时,炸弹就会爆炸,而我们这里的定时器是当时间到时,就会执行相应的任务

2.计时器的使用

在Java中,关于计时器的类时Timer

Timer类是java.util包提供的API。

Timer中最主要的方法是schedule方法,他是将我们的任务,和时间放进一个数组模拟的队列中,然后在指定时间执行指定的任务

代码示例:

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

schedule的第一个参数类型是TimerTask,这个类他继承了Runnable类,然后第二个参数是,当前程序运行多少时间执行这个任务,单位是ms

3.手搓定时器

简单介绍完java中的Timer的使用,下面我们就来模拟实现一个定时器

整体的一个思路:

1.定义任务类(TimerTask):用来存储每一个任务的属性,如执行的时间,以及要执行的任务

2.定义一个Timer类(定时器):每一个任务执行的先后顺序,以及执行过程中的一些细节问题

3.1定义一个TimerTask类

class TimerTask{private Runnable task;private long time;public TimerTask(Runnable task, long time) {this.task = task;this.time = time;}
}

在这个类中成员属性分别为要执行的任务,以及任务执行的时间,还有一个构造方法

3.2定义一个Timer类

class Timer{private PriorityQueue<TimerTask>queue=new PriorityQueue<>();public void schedule(Runnable task,long time){}public Timer() {Thread t=new Thread(()->{});t.start(); }}

1.在这个类中有一个优先级队列,这个是用来给各个任务执行的先后顺序进行排序的

2.schedule是用来将我们要执行的任务添加到优先级队列当中的

3.Timer()这个构造方法,是我们在创建这个类时,他就开启了一个线程,这个线程是用来按时间执行我们队列中的任务的,如果线程中有任务他就在指定时间去执行,如果没有任务,他就阻塞等待

3.3实现schedule方法

锁对象:

  Object lock=new Object();

schedule方法: 

    public void schedule(Runnable task,long delay){synchronized (lock){TimerTask timerTask=new TimerTask(task, System.currentTimeMillis()+delay);queue.offer(timerTask);}}

1.我们实例化一个TimerTask的对象,然后将schedule的参数作为任务,以及时间传递给TimerTask的构造方法作为参数(注意的是:这里构造方法接收的时间是任务执行的时间,而schedule参数的时间是任务距离调用schedule调用时相差的时间),所以构造方法参数的时间,我们要用当前时间加上延迟的时间(获取当前时间:System.currentTimeMillis());

2.得到TimerTask这个对象后,我们要将这个对象添加到优先级队列当中

3.在实例化Timer时,构造方法也会启动一个线程,所以我们这是一个多线程的程序,为了保证线程安全,我们给其加上一个锁

因为我们向优先级队列中添加的是我们自定义的类,他不知道该怎么对齐进行排序,所以我们要对TimerTask这个类定义一个比较规则

 class TimerTask implements Comparable<TimerTask>{@Overridepublic int compareTo(TimerTask o) {return (int)(this.time-o.time);}
}

我们将TimerTask实现一个Comparable接口,并重写Comparaable接口里面的comparaeTo方法,又因为我们想让时间近的任务放在队首,所以我们的比较规则是为了实现一个小根堆,如果this.time-o.time是一个整数就会将小的任务放在前面,然而我们的时间是long类型,我们需要将this.time-o.time的值强转为int类型

3.4实现Timer的构造方法

3.4.1随时随地查看优先级队列中是否有任务要执行

    public Timer() {Thread t=new Thread(()->{while(true){try {synchronized (lock){while(queue.isEmpty()){lock.wait();}}} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();}

1.第一个while循环是当一次任务执行完毕,再次查看队列中是否有要执行的任务

2.第二个while循环是查看队列中是否有任务,如果没有任务,我们就阻塞等待,直到schedule被调用时,我们这里的wait被唤醒,然后进行接下来的操作

3.wait一般搭配synchronized来使用保证线程安全

为了在队列为空时,向队列中添加任务后,需要将wait唤醒,所以在schedule方法中要加上notify

    public void schedule(Runnable task,long delay){synchronized (lock){TimerTask timerTask=new TimerTask(task, System.currentTimeMillis()+delay);queue.offer(timerTask);lock.notify();}}

3.4.2获取队首任务,并判断是否到执行时间

 TimerTask task=queue.peek();if(System.currentTimeMillis()<task.getTime()){lock.wait(task.getTime()-System.currentTimeMillis());}

1.获取队首任务,使用peek,而不使用poll

2.如果未到达执行时间,我们就阻塞等待任务执行时间和当前时间之间的时差

3.如果在这个阻塞等待的时间段内,使用schedule向队列中添加了一个比当前任务更早的任务,schedule中的notify会将我们这里的带时间的wait唤醒,然后重新获取队列中的队首任务

3.4.3到达执行时间执行任务

if(System.currentTimeMillis()<task.getTime()){lock.wait(task.getTime()-System.currentTimeMillis());}else {task.run();queue.poll();}

1.这里使用else,也就是当当前系统时间大于等于任务执行的时间,执行任务

2.如果不使用else,当在等待过程中,新插入一条任务,那么就会解除阻塞,执行run和poll,从而导致程序出错

task.run方法需要我们在TimerTask类中进行实现

    public void run(){task.run();}

4.整体的一个代码:

package Demo4;import java.util.PriorityQueue;class TimerTask implements Comparable<TimerTask>{private Runnable task;private long time;public TimerTask(Runnable task, long time) {this.task = task;this.time = time;}public void run(){task.run();}public long getTime() {return time;}@Overridepublic int compareTo(TimerTask o) {return (int)(this.time-o.time);}
}class Timer{private PriorityQueue<TimerTask>queue=new PriorityQueue<>();Object lock=new Object();public void schedule(Runnable task,long delay){synchronized (lock){TimerTask timerTask=new TimerTask(task, System.currentTimeMillis()+delay);queue.offer(timerTask);lock.notify();}}public Timer() {Thread t=new Thread(()->{while(true){try {synchronized (lock){while(queue.isEmpty()){lock.wait();}TimerTask task=queue.peek();if(System.currentTimeMillis()<task.getTime()){lock.wait(task.getTime()-System.currentTimeMillis());}else {
task.run();
queue.poll();}}} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();}}public class Main10 {public static void main(String[] args) {Timer timer=new Timer();timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello 3000");}},3000);timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello 2000");}},2000);timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello 1000");}},1000);}
}

完结: 

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​

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

相关文章:

  • 新手怎么学做网站就业培训机构有哪些
  • magento网站建设搭建网站步骤
  • 营销网站如何实现差异化南京seo公司
  • 服务器托管是啥搜索引擎优化排名培训
  • 山西手机网站建设网址大全123
  • b2c平台有哪些平台网址新区seo整站优化公司
  • WordPress突然全站404网站如何添加友情链接
  • 复制别人网站做第一站seo短视频网页入口引流下载
  • 基层建设论文收录在哪个网站百度统计api
  • 购买主机可以做网站吗楚雄今日头条新闻
  • 深圳专业网站建设公司哪家好宁波网络营销公司
  • ps做电商网站流程图百度图片识别搜索引擎
  • 做电影网站程序好用武汉网站建设推广公司
  • 如何做b2c网站下列关于友情链接说法正确的是
  • 网站开发中网页上传seo在线网站推广
  • 网站建设报价流程免费培训网站
  • 聊城网站建设服务好最新网域查询入口
  • 一般网站建设流程有哪些步骤官方百度app下载安装
  • 档案网站建设的步骤八大营销方式有哪几种
  • 手机网站免费制作平台semseo
  • 周口市做网站小红书seo排名
  • 网站开始怎么做的ps培训
  • 去哪个网站找题目给孩子做保定百度首页优化
  • 五道口网站建设惠州seo外包服务
  • 如何查看网站是否备案企业宣传册
  • 好的网站建设公司排名互联网宣传推广
  • 上海买二手房做哪个网站好seo快速排名优化
  • 十大中国网站制作免费广告
  • wordpress 文章主题关键词推广seo
  • 佛山网站建设佛山网络推广代运营公司靠谱吗