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

模板网站和定网上书城网站开发环境

模板网站和定,网上书城网站开发环境,关于网站开发的期刊,合肥网站建设网页设计文章目录 什么是定时器标准库中的定时器实现定时器 什么是定时器 定时器是一种编程工具,用于特定时间或固定时间间隔执行任务(代码逻辑),其核心功能是管理任务的调度和执行 标准库中的定时器 Timer 和 TimerTask 类 定位&#…

文章目录

    • 什么是定时器
    • 标准库中的定时器
    • 实现定时器

什么是定时器

定时器是一种编程工具,用于特定时间或固定时间间隔执行任务(代码逻辑),其核心功能是管理任务的调度和执行

标准库中的定时器

  1. Timer 和 TimerTask 类
    定位:早期的单线程定时器实现,适用于简单场景。
    核心类:
    Timer:用于调度任务。
    TimerTask:抽象类,需继承并实现 run() 定义任务逻辑。

实现定时器

import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.TimeUnit;class Mytask implements Comparable<Mytask>{private Runnable runnable;// 定义任务执行时间private long time;public Mytask(Runnable runnable,long delay){if(runnable==null){try{throw new IllegalAccessException("任务不能为空");} catch (IllegalAccessException e) {throw new RuntimeException(e);}}if(delay<0){try {throw new IllegalAccessException("时间不能小于0");} catch (IllegalAccessException e) {throw new RuntimeException(e);}}this.runnable=runnable;//计算出任务的具体时间this.time=delay+System.currentTimeMillis();}public Runnable getRunnable() {return runnable;}public long getTime() {return time;}@Overridepublic int compareTo(Mytask o) {if(this.getTime()-o.getTime()>0)return 1;else if(this.getTime()-o.getTime()==0)return 0;else return -1;}
}public class MyTimer {//定义线程内容private PriorityBlockingQueue<Mytask> priorityBlockingQueue=new PriorityBlockingQueue<>();public MyTimer() {//扫描线程Thread th1 = new Thread (()-> {while (true) {try {Mytask take = priorityBlockingQueue.take();//判断有没有到时间long times = System.currentTimeMillis();if (times >= take.getTime()) {//时间到了执行任务take.getRunnable().run();} else {long waittime = take.getTime() - times;//没有到时间放回阻塞队列priorityBlockingQueue.put(take);synchronized (this) {//进行休眠this.wait(waittime);}}} catch (InterruptedException e) {throw new RuntimeException(e);}}});th1.start();//创建一个后台线程Thread thread = new Thread (()->{while (true) {synchronized (this) {notifyAll();}//休眠一会try {TimeUnit.MICROSECONDS.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}}});//设置为后台线程thread.setDaemon(true);thread.start();}public void schedule(Runnable runnable,long time) {//构建一个Mytask对象Mytask mytask=new Mytask(runnable,time);//放入阻塞数组priorityBlockingQueue.put(mytask);//唤醒等待线程synchronized (this){this.notifyAll();}}
}

在这里插入图片描述
在这里插入图片描述
这里要注意当将锁在加在整个while(扫描线程)时会产生死锁

/扫描线程Thread th1 = new Thread (()-> {synchronized (this) {while (true) {try {Mytask take = priorityBlockingQueue.take();//判断有没有到时间long times = System.currentTimeMillis();if (times >= take.getTime()) {//时间到了执行任务take.getRunnable().run();} else {long waittime = take.getTime() - times;//没有到时间放回阻塞队列priorityBlockingQueue.put(take);//进行休眠this.wait(waittime);}} catch (InterruptedException e) {throw new RuntimeException(e);}}}});

在这里插入图片描述
引起死锁的原因

锁的持有与阻塞调用:
扫描线程 th1 的整个循环被包裹在 synchronized(this) 块中。
当队列为空时,priorityBlockingQueue.take() 会阻塞,但此时 th1 仍持有 this 锁。
其他线程(如主线程调用 schedule)需要获取 this 锁才能添加任务,但无法获得锁,导致它们被阻塞。

互相等待的僵局:
th1 在等待队列中有任务(被 take() 阻塞),但其他线程无法添加任务(因为它们需要 this 锁)。
其他线程在等待 th1 释放锁,而 th1 在等待其他线程添加任务,形成死锁。

1.synchronized和wait的使用:
在MyTimer类的构造方法中,扫描线程t1并使synchronized(this)进行同步,台线程 (thread) 也使用 synchronized (this) 来调用 notifyAll()。

2.wait 和 notifyAll 的逻辑
在从队列中拿到线程任务时如果线程任务还没有到会调用wait()进行等待,
在主线程在这里插入图片描述
后台线程 (thread) 也在尝试调用 notifyAll(),但它是在 synchronized (this) 块中执行的。如果此时没有其他线程持有 MyTimer 对象的锁,后台线程将无法执行 notifyAll()。所以锁得不到释放
任务的执行时间:

3.如果 Mytask 的执行时间设置得非常短(例如 0 毫秒),可能会导致 th1 线程不断地将任务放回队列并调用 wait(),而后台线程可能无法及时调用 notifyAll(),从而导致 th1 永远处于等待状态。

http://www.dtcms.com/a/566233.html

相关文章:

  • 信息论(一):从概率开始压缩消息
  • 营销网站建设的步骤过程工商注册公司流程
  • Python的变量拷贝
  • 自己服务器做网站如何备案网站排名是什么意思
  • Rust 完整指南:从安装到打包发布
  • 网站建设对称对比型太原网站建设外包须知传媒
  • 文献阅读——A Computational Model of Visual Recognition Memory via Grid Cells
  • 免费注册网页的网站企业网站建设一般要素包含哪些
  • 一个空间两个网站对seo网站备案名称更换
  • 优质的集团网站建设宁波网站建设xpckj
  • jajava程序产生RocketMQ消息,怎么查询到RocketMQ消息堆积
  • 北京轨道交通建设管理有限公司网站网站建设成本预算
  • Uet++项目
  • 机器视觉的工业控制面板丝印应用
  • 廖雪峰的网站怎么做的外贸网络营销是做什么的
  • 百度网站建设教程网站建设期末实践报告
  • uni-app 常用标签速查表
  • 网站主题模板下载安装建网站的资料
  • Java 数据结构
  • 济南网站建设铭盛信息临海钢结构设计网站
  • 相平面控制:深入解析一种经典的非线性控制系统设计方法
  • 测试用例评审,提升软件质量的有效手段
  • 睿艺美开封做网站网站上传 空间 数据库
  • 创美艺佳网站是谁做的衡阳网站建设开发价格
  • React Native 蓝牙开发实践:从权限配置到设备连接完整指南
  • Spring Boot——从零开始写一个接口:项目构建 + 分层实战
  • 公司网站介绍范文深圳坪山最新消息
  • 做听书网站怎么做行业门户网站方案
  • 价值重估 景气再启 投资人张利明纵论新能源投资策略
  • 网站制作明细报价表杭州新闻