news 2026/4/5 9:19:50

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/3/23 3:09:28

JAVA进阶 Thread学习06 synchronized关键字

synchronized的性质 synchronized在前面的文章中被称为同步锁,其实它的名称还不只这个,它也叫互斥锁.但是这里为了方便理解就把它理解为厕所的门锁. 1.互斥 举个例子,有个人上厕所把门给锁上,门锁会从"无人"的绿色标识转换到"有人"的红色标识.在厕所外面的…

作者头像 李华
网站建设 2026/4/4 0:21:43

Java学习进阶知识篇

系列文章目录 提示&#xff1a;....................... 文章目录 系列文章目录前言一、类和对象 面向对象基本介绍类的基本使用属性构造方法和析构方法对象 二、总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; Java面向对象编程的进阶知识 一、…

作者头像 李华
网站建设 2026/3/25 14:16:00

51单片机_数码管显示

51单片机_数码管显示 在51单片机的应用中&#xff0c;数码管显示是一项基础且常见的功能。数码管能够显示数字和一些字符&#xff0c;通过内部的发光二极管(LED)来实现。根据公共端的不同&#xff0c;数码管分为共阳极和共阴极两种类型。在共阴极数码管中&#xff0c;所有LED的…

作者头像 李华
网站建设 2026/3/25 19:33:12

Windows自动更新太烦?如何永久关闭win11自动更新

【2026实测】Win11自动更新怎么彻底关闭&#xff1f;Win11永久关闭自动更新最全教程 如果您希望阻止 Windows 11 在后台自动下载和安装更新&#xff0c;但系统仍持续弹出更新提示或强制重启&#xff0c;则可能是由于多种更新机制并行触发。以下是彻底关闭 Win11 自动更新的多种…

作者头像 李华