线程的使用—嘀嗒嘀嗒计时器

2023-10-28 14:59
文章标签 线程 使用 计时器 嘀嗒

本文主要是介绍线程的使用—嘀嗒嘀嗒计时器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目的

编写一个精确定时的小工具

编程实现

此程序包含两个线程

  • DidaDida线程:功能是计时,当时间到了则唤醒DidaDidaWorker线程
  • DidaDidaWorker线程:当时间到了之后要干的事情

这是DidaDida类的三个抽象方法

    public abstract void didadidaRunning();public abstract void didadidaStop();public abstract void itIsTheTime();

DidaDidaWorker线程

这是一个内部类,当启动这个线程时,先将其wiat(),变成阻塞态,等待被唤醒;这个内部类的作用是到时间之后要干的事情。

    public class DidaDidaWorker implements Runnable {public DidaDidaWorker() {}@Overridepublic void run() {while (goon) {synchronized (this) {try {this.wait();if (goon) {itIsTheTime();}} catch (InterruptedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}}}

开始计时

创建一个DidaDidaWorker线程并将其启动(启动后是本线程是阻塞态,并没有开始执行真正的代码);再创建本类的线程,用wait()将其阻塞,当真正开始运行run()方法的代码时再将其唤醒。

    public void startDidaDida() {goon = true;worker = new DidaDidaWorker();Thread workerThread = new Thread(worker);workerThread.setPriority(Thread.MAX_PRIORITY);workerThread.start();synchronized (lock) {new Thread(this, "DidaDida").start();try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}}

本类的线程(DidaDida的线程)

将worker线程wait指定秒数,再将其唤醒,执行itIsTheTime()方法

@Overridepublic void run() {synchronized (lock) {lock.notify();}if (waitTime == 0) {waitTime = DEFAULT_TIME;}didadidaRunning();while (goon) {synchronized (worker) {try {worker.wait(waitTime);worker.notify();} catch (InterruptedException e) {e.printStackTrace();}}}didadidaStop();}

测试

public class DidaDidaDemo extends DidaDida {private volatile int count;private String name;public DidaDidaDemo(int didadidaTime, String name) {this.name = name;setClock(didadidaTime);}public void startDidadida() {count = 0;startDidaDida();}public void stopDidadida() {didadidaStop();}@Overridepublic void didadidaRunning() {System.out.println(CurrentTime.logMessage("滴答滴答开始工作……"));}@Overridepublic void didadidaStop() {System.out.println(CurrentTime.logMessage("滴答滴答停止工作"));}@Overridepublic void itIsTheTime() {System.out.println(CurrentTime.logMessage("线程" + name+ ":第" + ++count + "次工作!"));}}
	public static void main(String[] args) {DidaDidaDemo dida1 = new DidaDidaDemo(1000, "第一个");Scanner in = new Scanner(System.in);String message = "";while (!message.equalsIgnoreCase("x")) {message = in.nextLine();if (message.equalsIgnoreCase("st")) {dida1.startDidadida();} else if (message.equalsIgnoreCase("sp")) {dida1.stopDidaDida();}}in.close();}

运行结果

这篇关于线程的使用—嘀嗒嘀嗒计时器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/293992

相关文章

SpringBoot实现虚拟线程的方案

《SpringBoot实现虚拟线程的方案》Java19引入虚拟线程,本文就来介绍一下SpringBoot实现虚拟线程的方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录什么是虚拟线程虚拟线程和普通线程的区别SpringBoot使用虚拟线程配置@Async性能对比H

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为