news 2026/4/15 2:39:29

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/15 2:39:29

面试 Java 基础八股文十问十答第二期

面试 Java 基础八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 11.什么是反射&#xff1f;反射有哪些作用&#xff1f;反射在Sping中的体现 (1): 什么是反射? 反射可以在运行时获取到一个类的所有信息&#xf…

作者头像 李华
网站建设 2026/4/8 23:58:55

毫米波V2I网络的链路层仿真研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

作者头像 李华
网站建设 2026/4/13 18:15:13

2026最全Gemini学生优惠申请指南

Google 在 2025 年正式推出 Gemini 学生优惠计划&#xff0c;符合条件的学生可在2026年1月31日前通过认证免费获得价值约 $300 的 Google AI Pro 服务长达 15 个月。这意味着你可以零成本使用&#xff1a;Gemini Advanced&#xff08;2.5 Pro / 3 系列模型&#xff09;2TB Goog…

作者头像 李华
网站建设 2026/4/13 10:57:05

Google广告频繁被拒如何解决?附解决与防封指南

在出海广告投放中&#xff0c;谷歌广告是众多品牌和独立站的核心渠道之一。然而&#xff0c;不少投手在实操中频繁遭遇广告被拒登&#xff0c;甚至账户直接被封&#xff0c;严重影响投放进度和预算使用效率。那么&#xff0c;Google广告被拒的原因到底有哪些&#xff1f;如何快…

作者头像 李华
网站建设 2026/3/26 12:47:14

如何在ubuntu下安装奥比中光的SDK呢?(C++版本的)

问题描述&#xff1a; 如何在ubuntu下安装奥比中光的SDK呢&#xff1f;&#xff08;C版本的&#xff09; 问题解答&#xff1a; 我给你直接说结论 怎么下&#xff0c;不绕弯子。 一、Gemini 2 用哪个下载链接&#xff1f; 奥比中光 Gemini 2 / Gemini 2 L 使用的是 Orbbec…

作者头像 李华