news 2026/4/18 6:48:18

JAVA进阶 THREAD学习10 多线程案例--计时器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JAVA进阶 THREAD学习10 多线程案例--计时器

标准库中计时器的使用

  • Timer类的实例化对象
  • TimerTask类的是实例化对象–在run方法中存放运行的代码
  • 延迟的时间(相对时间,相对于当前时间之后的多少毫秒等)

时间需要安排schedule

public static void main(String[] args) { System.out.println("From now on,after 4s will print a word"); Timer timer=new Timer(); timer.schedule(new TimerTask(){ public void run(){ System.out.println("LOVE"); } },4000); }

自定义一个计时器

基本构成

  • 两量

    • PriorityBlockingQueue
    • Object mailBox
  • 两类

    • MyTimeTask
    • Worker
  • 两方法

    • MyTimer()
    • schedule()
两量
  • PriorityBlockingQueue

计时器的核心,使用优先级队列来存储计时器执行的基本单位TimeTask,因为需要按照时间顺序一一执行对应的Task

private PriorityBlockingQueue<Task> queue = new PriorityBlockingQueue();
  • Object mailBox

协调线程和work线程等待的同步对象,为实现多线程顺序执行提供锚点(“系铃人”)。

private Object mailBox = new Object();
两类
  • MyTimeTask

计时器的基本单元
两变量
- Runnable command(需要特定时间执行的代码)
- long time(用于存储绝对时间)
三方法
- 构造方法(存储执行代码,将存入的相对时间转换为绝对时间)

static class Task implements Comparable<Task> { private Runnable command; private long time; public Task(Runnable command, long time) { this.command = command; // time 中存的是绝对时间, 超过这个时间的任务就应该被执行 this.time = System.currentTimeMillis() + time; } public void run() { command.run(); } @Override public int compareTo(Task o) { // 谁的时间小谁排前面 return (int) (time - o.time); } }
  • Worker

继承于线程,用于执行相关的代码

class Worker extends Thread { @Override public void run() { while (true) { try { Task task = queue.take(); long curTime = System.currentTimeMillis(); if (task.time > curTime) { // 时间还没到, 就把任务再塞回去 queue.put(task); synchronized (mailBox) { // 指定等待时间 wait mailBox.wait(task.time - curTime); } } else { // 时间到了, 可以执行任务 task.run(); } } catch (InterruptedException e) { e.printStackTrace(); break; } } } }
两方法
  • MyTimer()

构造方法,启动运行代码的work

public MyTimer() { // 启动 worker 线程 Worker worker = new Worker(); worker.start(); } // schedule 原意为 "安排" public void schedule(Runnable command, long after) { Task task = new Task(command, after); queue.offer(task); synchronized (mailBox) { mailBox.notify(); } }
  • schedule()

“安排”方法,用于添加新的执行代码和相对等待时间

public void schedule(Runnable command, long after) { Task task = new Task(command, after); queue.offer(task); synchronized (mailBox) { mailBox.notify(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 13:41:01

Java框架SpringBoot(一)

一、Spring的优缺点 优点 开源,轻量级,非侵入式的一站式框架,简化企业级应用开发。 控制反转(IOC),依赖注入(DI)降低了组件之间的耦合性&#xff0c;实现了软件各层之间 的解耦。 面向切面(AOP)&#xff0c;利用它可以很容易实现一些拦截&#xff0c;如事务控制等。 spring 对于…

作者头像 李华
网站建设 2026/4/16 10:51:56

JavaScript 调试

JavaScript 调试 引言 JavaScript 作为 Web 开发中的核心语言,其调试能力直接影响到开发效率和代码质量。本文将详细介绍 JavaScript 调试的基本概念、常用调试工具、调试技巧以及最佳实践,帮助开发者更好地掌握 JavaScript 调试技术。 调试的基本概念 什么是调试? 调试…

作者头像 李华
网站建设 2026/3/9 19:24:07

[数字信号处理-入门] 滤波器设计

[数字信号处理-入门] 滤波器设计 个人导航 知乎&#xff1a;https://www.zhihu.com/people/byzh_rc CSDN&#xff1a;https://blog.csdn.net/qq_54636039 注&#xff1a;本文仅对所述内容做了框架性引导&#xff0c;具体细节可查询其余相关资料or源码 参考文章&#xff1a…

作者头像 李华
网站建设 2026/4/16 23:43:57

国内旅游景点的数据爬虫与可视化分析计算机毕业设计项目源码+毕业论文+打包ppt+代码软件修改工具

博主介绍&#xff1a; CSDN毕设辅导第一人、靠谱第一人、csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客优秀创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;…

作者头像 李华
网站建设 2026/3/22 23:59:30

大模型面试题49:从白话到进阶详解SFT 微调的 Loss 计算

SFT 的全称是 Supervised Fine-Tuning&#xff08;监督微调&#xff09;&#xff0c;它的核心目标是&#xff1a;让预训练好的大模型&#xff0c;在人工标注的「指令-回答」数据上学习&#xff0c;精准匹配人类的指令意图。 而 Loss&#xff08;损失值&#xff09;的作用&#…

作者头像 李华