web 初始 13

在这里插入代码片
定时器,一个概念,可以指实物,也可以指幻想。
java里就有这么个东西,timer关键字,使用 Java 来调度定时任务时,我们经常会使用 Timer 类搞定。(今天记了一天单词,就不皮了,直接挂概念吧)
Timer 调度任务有一次性调度和循环调度,循环调度分为固定速率调度(fixRate)和固定时延调度(fixDelay)。固定速率就好比你今天加班到很晚,但是到了第二天还必须准点到公司上班,如果你一不小心加班到了第二天早上 9 点,你就连休息的时间都没有了。而固定时延的意思是你必须睡够 8 个小时再过来上班,如果你加班到凌晨 6 点,那就可以下午过来上班了。固定速率强调准点,固定时延强调间隔。
Timer 类里包含一个任务队列和一个异步轮训线程。任务队列里容纳了所有待执行的任务,所有的任务将会在这一个异步线程里执行,切记任务的执行代码不可以抛出异常,否则会导致 Timer 线程挂掉,所有的任务都没得执行了。单个任务也不易执行时间太长,否则会影响任务调度在时间上的精准性。比如你一个任务跑了太久,其它等着调度的任务就一直处于饥饿状态得不到调度。所有任务的执行都是这单一的 TimerThread 线程。
下面先贴上模板代码,明天会附上分析(复习4级记单词来着,没好好看代码)

在这里插入代码片
import java.util.concurrent.PriorityBlockingQueue;
public class Timer {
private static class TimerTask implements Comparable<TimerTask> {
private Runnable command;
private long time;
private TimerTask(Runnable command, long after) {
this.command = command;
this.time = System.currentTimeMillis() + after;
}
private void run() {
command.run();
}
@Override
public int compareTo(TimerTask o) {
return (int)(time - o.time);
}
}
private PriorityBlockingQueue<TimerTask> queue = new PriorityBlockingQueue<>();
private Object mailbox = new Object();
private class Worker extends Thread {
@Override
public void run() {
while (true) {
try {
TimerTask task = queue.take();
long ms = System.currentTimeMillis();
if (task.time > ms) {
queue.put(task);
synchronized (mailbox) {
 mailbox.wait(task.time - ms);
}
} else {
task.run();
}
} catch (InterruptedException e) {
break;
}
}
}
}
public Timer() {
Worker worker = new Worker();
worker.start();
}
public void schedule(Runnable command, long after) {
TimerTask task = new TimerTask(command, after);
queue.offer(task);
synchronized (mailbox) {
mailbox.notify();
}
}
public static void main(String[] args) throws InterruptedException {
Timer timer = new Timer();
Runnable command = new Runnable() {
@Override
public void run() {
System.out.println("我来了");
timer.schedule(this, 3 * 1000);
}
};
timer.schedule(command, 3 * 1000);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值