定时器(闹钟)设计

news/2025/1/16 5:44:49/

1.创建MyTimerTask类,定义两个变量,运行时间runAtTime和任务target;
2.构造方法中初始化时间和任务,时间为传入时间参数+系统当前时间;
3.复写Comparable比较执行时间的优先级;

private static class MyTimerTask implements Comparable<MyTimerTask>{long runAtTime;Runnable target;public MyTimerTask(long delay, Runnable target){this.runAtTime = System.currentTimeMillis()+delay;this.target = target;}@Overridepublic int compareTo(MyTimerTask o) {if(o.runAtTime < runAtTime){return 1;}else if(o.runAtTime == runAtTime){return 0;}else {return -1;}}
}

4.定义一个阻塞队列(优先级队列);
5.写一个工作线程Worker;
6.工作线程中比较线程运行时间和系统当前时间大小,若系统时间小,说明还未到执行时间,将任务放回优先级队列,并等待所差时间,否则时间到执行任务;

private PriorityBlockingQueue<MyTimerTask> queue = new PriorityBlockingQueue<>();
Thread worker = new Worker();private class Worker extends Thread{@Overridepublic void run() {while (true){try {MyTimerTask task = queue.take();if(task.runAtTime <= System.currentTimeMillis()){task.target.run();}else {queue.put(task);synchronized (this) {wait(task.runAtTime - System.currentTimeMillis());}}} catch (InterruptedException e) {e.printStackTrace();}}}
}

7.重写主线程构造方法,启动worker线程;
8.写schedule方法参数为任务target和等待时间delay,内容为创建一个MyTimerTask对象传参,并将该对象放入优先级队列中;并且唤醒一个等待中线程,
9.在main方法中写一个任务target,创建一个主类对象,调用schedule方法传入target和等待时间;
注:如果不重写compareTo方法会无法比较,造成运行时异常;

MyTimer(){worker.start();}public void schedule(Runnable target, long delay){MyTimerTask task = new MyTimerTask(delay, target);queue.put(task);synchronized (this){notify();}}public static void main(String[] args) {Runnable target = new Runnable() {@Overridepublic void run() {System.out.println("五秒后");}};MyTimer timer = new MyTimer();timer.schedule(target, 5000);}
}

完成代码如下:

import java.util.concurrent.PriorityBlockingQueue;public class MyTimer {private static class MyTimerTask implements Comparable<MyTimerTask>{long runAtTime;Runnable target;public MyTimerTask(long delay, Runnable target){this.runAtTime = System.currentTimeMillis()+delay;this.target = target;}@Overridepublic int compareTo(MyTimerTask o) {if(o.runAtTime < runAtTime){return 1;}else if(o.runAtTime == runAtTime){return 0;}else {return -1;}}}private PriorityBlockingQueue<MyTimerTask> queue = new PriorityBlockingQueue<>();Thread worker = new Worker();private class Worker extends Thread{@Overridepublic void run() {while (true){try {MyTimerTask task = queue.take();if(task.runAtTime <= System.currentTimeMillis()){task.target.run();}else {queue.put(task);Thread.sleep(task.runAtTime-System.currentTimeMillis());}} catch (InterruptedException e) {e.printStackTrace();}}}}MyTimer(){worker.start();}public void schedule(Runnable target, long delay){MyTimerTask task = new MyTimerTask(delay, target);queue.put(task);}public static void main(String[] args) {Runnable target = new Runnable() {@Overridepublic void run() {System.out.println("五秒后");}};MyTimer timer = new MyTimer();timer.schedule(target, 5000);}
}

http://www.ppmy.cn/news/855240.html

相关文章

【单片机】含有闹钟的时钟设计

#include<reg52.h> #define uchar unsigned char #define uint unsigned intsbit key1 P3^2; //手动控制数码管1,2位 sbit key2 P3^3; //手动控制数码管4,5位 sbit key3 P3^4; //手动控制数码管7,8位 sbit key5 P1^6; //手动切换数码管显示&#xff08;可显示三…

定闹钟时刻

小乐乐比较懒惰&#xff0c;他现在想睡觉&#xff0c;然后再去学习。他知道现在的时刻&#xff0c;以及自己要睡的时长&#xff0c;想设定一个闹钟叫他起床学习&#xff0c;但是他太笨了&#xff0c;不知道应该把闹钟设定在哪个时刻&#xff0c;请你帮助他。(只考虑时和分&…

单片机实现时钟闹钟

之前做了一个单片机课设&#xff0c;用51单片机实现时钟闹钟&#xff0c;程序比较简单&#xff0c;思路也有很多种&#xff0c;放上我的代码供大家参考。 按键功能说明&#xff1a; 矩阵键盘&#xff1a; 第1到第10个按键分别对应数字0-9&#xff1b; 独立按键&#xff1a; Key…

闹钟

Android随笔之——闹钟制作铺垫之AlarmManager详解 说实话&#xff0c;之前写的两篇博客Android广播机制Broadcast详解、Android时间、日期相关类和方法以及现在要写的&#xff0c;都算是为之后要写的闹钟应用做铺垫&#xff0c;有兴趣的话&#xff0c;大家可以去看看前两篇博客…

智慧闹钟

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 首先相对于传闹钟设置闹铃的方式&#xff0c;我想把这款创意闹钟设计成通过光照传感器来实现对闹钟的开启&#xff0c;更有效实现闹钟的自动化、智能化&#xff0c;不过为了防止误触带来闹钟的开启&#xff0c;需要对开启条件…

定时闹钟功能(带铃声 可延时)

项目中需要写一个小闹钟提醒用户。 时间选择器使用的是 TimePickerDialog private AlarmManager alarm; // 闹钟管理private Calendar calendar Calendar.getInstance() ;//取得Calender对象new TimePickerDialog(getContext(), 0, new TimePickerDialog.OnTimeSetListener() …

静音模式下,来闹钟能响铃。

修改方案为&#xff1a; static srv_prof_volume_level srv_prof_play_audio_query_volume(srv_prof_tone_enum tone_type) { switch(tone_type) { 。。。。。。。。。。。。。。。。 case SRV_PROF_TONE_KEYPAD: { return g_srv_prof.cur_setting.keypad_vol; } 。。。。。。。…

Android5.0 静音模式下让闹钟仍然响铃

最近在看Android 5.0的代码,发现可以通过音量键来控制情景模式,而且在此次升级的静音模式可谓是完全静音了,就连闹钟都不会发音。 我要做一个可以在静音模式下选择闹钟是否仍然响铃的开关。 本文仅为学习笔记,大神勿喷。 在DeskClock源码中,com.android.deskclock.Setti…