当前位置:网站首页>Multi-threaded cases - timer
Multi-threaded cases - timer
2022-08-09 09:39:00 【Living_Amethyst】
定时器是什么
定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”. 达到一个设定的时间之后, 就执行某个指定好的代码.
定时器是一种实际开发中非常常用的组件.
比如网络通信中, 如果对方 500ms 内没有返回数据, 则断开连接尝试重连.
比如一个 Map, 希望里面的某个 key 在 3s 之后过期(自动删除).
类似于这样的场景就需要用到定时器
标准库中的定时器
- 标准库中提供了一个 Timer 类. Timer 类的核心方法为 schedule .
- schedule 包含两个参数. 第一个参数指定即将要执行的任务代码, 第二个参数指定多长时间之后
执行 (单位为毫秒).
示例:
public static void main(String[] args) {
// java.util 里的一个组件
Timer timer = new Timer();
//schedule这个方法的效果 是 “安排一个任务”
//不是立刻执行 而是3000毫秒之后执行
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("这是一个要执行的任务");
}
},3000);
}
模拟实现定时器
很多细节的解析再注释中注明
//模拟实现 定时器
import java.util.PriorityQueue;
import java.util.concurrent.PriorityBlockingQueue;
class MyTask implements Comparable<MyTask>{
//任务要干啥
private Runnable command;
//任务啥时候干
private long time; //绝对时间
public MyTask (Runnable command,long after){
this.command = command;
//此处记录的时间是一个绝对的时间戳,不是多长时间后执行
this.time = System.currentTimeMillis()+after;
}
//执行任务的方法 直接在内部调用 Runnable 的 run 即可
public void run(){
command.run();
}
public long getTime() {
return time;
}
@Override
public int compareTo(MyTask o) {
//希望时间小的在前 大的在后
return (int) (this.time - o.time);
}
}
class MyTimer {
//用来阻塞等待的锁对象
private Object locker = new Object();
//使用优先级队列来保存若干个任务
private PriorityBlockingQueue<MyTask> queue = new PriorityBlockingQueue<>();
// command:要执行的任务是啥
// after:多长时间之后执行这个任务
public void schedule(Runnable command,long after) {
MyTask myTask = new MyTask(command,after);
// 防止 新插入的任务 比之前队首的任务的时间还早,需要唤醒
synchronized (locker){
queue.put(myTask); //把加入操作也加锁
locker.notify();
}
}
public MyTimer(){
// 启动一个线程
Thread t = new Thread(()->{
while (true){
//循环过程中 不断尝试从队列中获取到队首元素
//判定队首元素当时的时间是否就绪,就绪了就执行 不就绪就不执行
try {
synchronized (locker) {
MyTask myTask = queue.take();//取的是队首元素,时间最早的任务
long curTime = System.currentTimeMillis();
if (myTask.getTime() > curTime) {
//时间还没到
queue.put(myTask); //把任务再放回队列
//队首的(最早执行的)元素时间还没到,需要等待,不然一直循环 CPU空转 内耗
locker.wait(myTask.getTime() - curTime);
} else {
//时间到了 执行任务
myTask.run();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
}
}
public class Demo18 {
public static void main(String[] args) {
MyTimer myTimer = new MyTimer();
myTimer.schedule(new Runnable() {
@Override
public void run() {
System.out.println("111");
}
},2000);
myTimer.schedule(new Runnable() {
@Override
public void run() {
System.out.println("222");
}
},4000);
myTimer.schedule(new Runnable() {
@Override
public void run() {
System.out.println("333");
}
},6000);
}
}
边栏推荐
- 4.泛型和工具类
- Go-指针的那些事
- A first look at the code to start, Go lang1.18 introductory refining tutorial, from Bai Ding to Hongru, the first time to run the golang program EP01
- MySQL关于表的知识点,进来学习!
- 关于一次性通过CISSP考试的一点经验分享
- 【ASM】字节码操作 MethodVisitor 案例实战 生成对象
- class object property method class member
- [Machine Learning] Detailed explanation of web crawler combat
- 真·鸡汤文
- 梦笔记0809
猜你喜欢

在anaconda环境中配置cuda和cudnn
What does the test plan include?What is the purpose and meaning?

Another implementation of lateral view explode

命令行查询数据库
![[Machine Learning] Detailed explanation of web crawler combat](/img/ac/f00f0c81e66ba526ac39ee60fad72b.png)
[Machine Learning] Detailed explanation of web crawler combat

搭建Tigase进行二次开发

列表

What are the basic concepts of performance testing?What knowledge do you need to master to perform performance testing?

BigDecimal用法常用操作记录
![[Personal study summary] CRC verification principle and implementation](/img/99/ae0862522cd0d1c8f45604b9cd88c5.png)
[Personal study summary] CRC verification principle and implementation
随机推荐
8.Properties property collection
GBase数据库中,源为 oracle 报出“ORA-01000:超出打开游标最大数”
Command line query database
LeetCode56:合并区间 C语言解法,注解详细 一看就懂!
web测试之功能测试常用的方法有哪几种?有什么要点要注意?
seata处理分布式事务
The div simulates the textarea text box, the height of the input text is adaptive, and the word count and limit are implemented
通过程序发送 Gmail 邮件
.equals ==
字符串
Rights management model, ACL, RBAC and ABAC (steps)
try catch 对性能影响
unittest测试框架原理及测试流程解析,看完绝对有提升
mysql 修改密码和忘记密码操作
.ts 音频文件转换成 .mp3 文件
RPC服务远程漏洞
Ontology Development Diary 03 - When debugging is in progress
五个不同事物隔离级别,七个事物传播行为
安装torch_sparse失败解决方法
Summary of steps and methods for installing and uninstalling test cases that you must read