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

做影集的网站或软件下载做兼职写小说网站

做影集的网站或软件下载,做兼职写小说网站,做网站是什么样的工作,手机编程游戏软件目录 一 什么是定时器? 二 标准库中的定时器 三 自定义实现定时器 一 什么是定时器? 定时器是一种用于在指定时间或以固定间隔执行任务的工具。 为什么需要定时器? 提高代码效率和可维护性。实现自动化任务调度。 二 标准库中的定时器 1.标准库中提供了一个Timer类&…

目录

一 什么是定时器?

二 标准库中的定时器 

三 自定义实现定时器 


一 什么是定时器?

定时器是一种用于在指定时间或以固定间隔执行任务的工具。

为什么需要定时器?

  • 提高代码效率和可维护性。
  • 实现自动化任务调度。

二 标准库中的定时器 

1.标准库中提供了一个Timer类,Timer类的核心方法为schedule;

2.schedule包含两个参数,第一个参数为即将要执行的任务代码,第二个参数为指定多长时间之后执行(单位为毫秒)。

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

三 自定义实现定时器 

要自定义一个定时器,我们需要满足两个条件:

  1. 被调度的任务可以按照指定时间执行;
  2. 一个定时器可以调度多个任务,并按照最初约定的时间执行它们。

1.被调度的任务可以按照指定时间执行

要实现第一个条件,我们可以创建一个扫描线程来扫描任务列表,检查每个任务是否到达指定的执行时间。如果任务到达了预定的执行时间,就执行相应的代码;如果没有达到预定的执行时间,就不执行任务。

2.一个定时器可以调度多个任务,并按照最初约定的时间执行它们。

针对第二个条件,我们可以使用一个优先级队列(PriorityQueue),这个队列可以根据任务的执行时间进行排序,使得时间最早的任务位于队列的前端,即最先要执行的任务。这样,在第一个条件中描述的扫描线程只需要检查队列的首元素即可,而不需要遍历整个任务列表。

 这里还需要处理一个小问题,就是我们如何描述一个任务?我们可以定义一个MyTimerTask 类实现了一个任务对象,用于封装任务的执行逻辑(Runnable)和执行时间(time)。 

// 定义一个任务类,用于封装任务的执行逻辑和执行时间
class MyTimerTask implements Comparable<MyTimerTask> {// 任务的执行逻辑,使用 Runnable 接口表示private Runnable runnable;// 任务的执行时间(以毫秒为单位)private long time;/*** 构造函数,用于创建一个任务对象* * @param runnable 任务的执行逻辑* @param delay    任务的延迟时间(以毫秒为单位)*/public MyTimerTask(Runnable runnable, long delay) {this.runnable = runnable; // 设置任务的执行逻辑this.time = System.currentTimeMillis() + delay; // 计算任务的执行时间(当前时间 + 延迟时间)}/*** 实现 Comparable 接口的 compareTo 方法,用于比较两个任务的执行时间* * @param o 另一个 MyTimerTask 对象* @return 负数表示当前任务先执行,正数表示当前任务后执行,0 表示同时执行*/@Overridepublic int compareTo(MyTimerTask o) {// 比较两个任务的执行时间,返回差值return (int)(this.time - o.time);}/*** 获取任务的执行时间* * @return 任务的执行时间(以毫秒为单位)*/public long getTime() {return time;}/*** 获取任务的执行逻辑* * @return Runnable 对象,表示任务的具体操作*/public Runnable getRunnable() {return runnable;}
}

按照上述两个条件我们可以写出下述的代码:

import java.util.PriorityQueue;class MyTimer {// 优先队列,用于存储任务,按任务的执行时间排序private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();// 锁对象,用于线程同步private Object locker = new Object();/*** 添加一个一次性任务到定时器中** @param runnable 任务的执行逻辑* @param delay    任务的延迟时间(以毫秒为单位)*/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 {}}} catch (InterruptedException e) {e.printStackTrace(); // 捕获线程中断异常并打印堆栈信息}}});t.start(); // 启动调度线程}
}

MyTimer 类通过优先队列(PriorityQueue<MyTimerTask>)按任务的执行时间排序来管理任务,并利用锁对象(locker)确保线程安全。其核心方法 schedule 用于添加一次性任务到定时器中,构造函数则启动一个后台线程持续调度任务。调度线程在队列为空时进入等待状态,当有新任务加入时被唤醒;如果当前时间达到或超过任务的执行时间,则执行任务并将其从队列中移除,否则线程等待至任务的预定执行时间。这里需要注意的是,当使用一个自定义类作为PriorityQueue对象时,记得实现Comparable接口并重写compareTo方法来定义元素的自然顺序。

但是上面的代码还存在一个问题,如果当前任务未到执行时间时,代码会不断重复while循环操作。这种现象被称为"忙等"。为了更有效地利用CPU资源,我们需要使用阻塞式等待而不是忙等。

在这种情况下,我们知道等待的时间比较明确,第一时间想到了使用sleep方法来等待,但是可能会出现问题。例如,如果我们添加了一个比之前添加的任务更早的任务,那么可能会错过新任务的执行时间。
因此,我们可以使用wait方法来实现阻塞式等待更为合适,因为它可以更方便地唤醒线程并重新检查时间。 

import java.util.PriorityQueue;class MyTimer {// 优先队列,用于存储任务,按任务的执行时间排序private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();// 锁对象,用于线程同步private Object locker = new Object();/*** 添加一个一次性任务到定时器中** @param runnable 任务的执行逻辑* @param delay    任务的延迟时间(以毫秒为单位)*/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(); // 启动调度线程}
}

 好了,到这里实现自定义实现定时器代码已经结束了。

http://www.dtcms.com/wzjs/567754.html

相关文章:

  • 响应式网站怎么做无缝轮播图lnmp.org wordpress
  • 创建空白网站零食加盟店10大品牌前三名
  • 微信网站全称怎样给自己网站做反链
  • 15年做哪个网站能致富产品设计的定义
  • 在线一键建站系统网站利用百度离线地图
  • 网站的付款链接怎么做的新开传奇网站推荐
  • 网站建设对于企业发展的优势寺庙网站建设
  • 图标设计网站微信网站建设企业
  • 阿里云做视频网站可以吗泰州网站制作计划
  • 海口网站推广公司上海seo优化
  • html5网站欣赏 国内芷江建设局网站
  • 公司网站建设的费用会计处理专做律所网站
  • 怎么做二维码网站郑州网络推广平台有哪些
  • 网站怎么seo关键词排名优化推广延边北京网站建设
  • 医疗器械网站素材国外购买域名网站
  • 最新网站开发工具兰博沃金牛座手表官方网站
  • app设计网站推荐lol有哪些网站是做陪玩的
  • 惠民建设局网站如何做网站的内容
  • 企业做网站的注意什么问题哈尔滨网站建设哪儿好薇
  • 无锡科技网站建设免费搭建永久网站步骤
  • 汕头网站建设方案维护网站设计相似侵权吗
  • 桐乡做网站的公司html代码怎么下载
  • php怎么写购物网站商品显示页面网站业务怎么做
  • 网站做代理还可以刷水吗wordpress比较好的主题
  • seo排名优化的网站WordPress数据API
  • 网站制作维护工商营业执照注册查询官网
  • 青海做网站团队建设游戏网站
  • 网站制作有前途吗哪个网站上做自媒体最好
  • 做网站的内容样本做h5网站
  • 福州网站建设服务建设部考试中心网站