news 2026/6/3 12:02:27

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/5/30 16:13:09

通信协议仿真:蓝牙协议仿真_(6).蓝牙网络拓扑

蓝牙网络拓扑 1. 蓝牙网络基础 蓝牙网络拓扑是指蓝牙设备在无线通信网络中的组织和连接方式。理解蓝牙网络的基本概念和拓扑结构对于进行蓝牙协议仿真至关重要。蓝牙网络可以分为两种主要类型&#xff1a;基础模式&#xff08;Basic Rate/Enhanced Data Rate, BR/EDR&#xff0…

作者头像 李华
网站建设 2026/5/31 14:36:47

通信协议仿真:蓝牙协议仿真_(9).蓝牙仿真案例分析

蓝牙仿真案例分析 在上一节中&#xff0c;我们已经介绍了蓝牙协议的基本概念和结构。本节将通过具体的案例来分析蓝牙协议的仿真过程&#xff0c;帮助读者更好地理解如何在实际开发中应用蓝牙仿真技术。我们将从以下几个方面进行详细的分析&#xff1a; 蓝牙设备连接仿真蓝牙数…

作者头像 李华
网站建设 2026/5/28 14:27:18

Java实战:Spring Boot application.yml配置文件详解

本文将详细介绍Spring Boot application.yml 配置文件的使用和配置项。我们将探讨 application.yml 文件的基本概念&#xff0c;以及如何使用它来配置Spring Boot应用程序的各个方面。此外&#xff0c;我们将通过具体的示例来展示如何配置不同的Spring Boot组件&#xff0c;如数…

作者头像 李华
网站建设 2026/5/28 8:12:03

51单片机__LED相关

51单片机__LED相关 单片机介绍 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU 内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能 单片机的任务是信息采集&#xff08;依靠传感器&#xff09;、处理&#xff08;依靠CPU&…

作者头像 李华
网站建设 2026/5/30 17:10:35

Prompt Tuning动态选医疗特征提速诊断

&#x1f4dd; 博客主页&#xff1a;Jax的CSDN主页 Prompt Tuning动态选医疗特征提速诊断 目录Prompt Tuning动态选医疗特征提速诊断 引言&#xff1a;诊断效率的全球性挑战 技术原理&#xff1a;动态特征选择的机制创新 现实应用&#xff1a;2023年临床试点的突破性验证 挑战与…

作者头像 李华