Java定时器通信协议管理模块Timer详解
短信预约 -IT技能 免费直播动态提醒
Timer详解
Timer
和TimerTask
用于在后台线程中调度任务的java.util
类。TimerTask
负责任务的执行,Timer
负责任务的调度。
定时功能
Timer提供了三种定时模式:
- 一次性任务
- 按照固定的延迟执行(
fixed delay
) - 按照固定的周期执行(
fixed rate
)
执行一次
Timer
提供了两种方法,应用于不同场景:
//在当前时间往后delay个毫秒开始执行
public void schedule(TimerTask task, long delay) {...}
//在指定的time时间点执行
public void schedule(TimerTask task, Date time) {...}
public static void main(String[] args) {
//定义一个Timer
Timer timer = new Timer("test-timer");
//定义一个TimerTask
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("任务执行时间:" + new Date() + "------------"
+ "线程:" + Thread.currentThread().getName());
}
};
long delay = 3000L;
timer.schedule(task, delay);
System.out.println("任务添加时间:" + new Date() + "------------"
+ "线程:" + Thread.currentThread().getName());
}
工作方式:当达到我们指定的时间,执行一次结束
任务虽然运行结束,但进程没有被销毁。并且执行任务的线程名为我们定义的Timer
的名称。
我们看一下源码:
public class Timer {
//小顶堆,用来存放timeTask
private final TaskQueue queue = new TaskQueue();
private final TimerThread thread = new TimerThread(queue);
public Timer(String name) {
thread.setName(name);
thread.start();
}
}
public abstract class TimerTask implements Runnable {
long nextExecutionTime;
long period = 0;
public abstract void run();
}
TaskQueue
:基于小顶堆实现,用来存放timerTask
TimerThread
:任务执行线程,继承Thread
类nextExecutionTime
:假如任务需要多次执行表示下一次执行时间period
:每次任务执行间隔时间run()
:我们执行任务的内容
创建一个 Timer
对象就是新启动了一个线程,但是这个新启动的线程,并不是守护线程,它一直在后台运行,通过如下 可以将新启动的 Timer
线程设置为守护线程。我们可以使用以下构造方法(public Timer(boolean isDaemon)
或public Timer(String name, boolean isDaemon)
)来设置。
Fixed Delay模式
//从当前时间开始delay个毫秒数开始定期执行,周期是period个毫秒数
public void schedule(TimerTask task, long delay, long period) {...}
////从指定的firstTime开始定期执行,往后每次执行的周期是period个毫秒数
public void schedule(TimerTask task, Date firstTime, long period){...}
工作方式:
- 第一次执行,按照指定时间开始(如果此时
TimerThread
没有执行其他任务),如有其他任务在执行,那就需要等到其他任务执行完成才能执行 - 第二次执行,每次任务是上一次任务开始执行时间加上执行的
period
时间。
到此这篇关于Java定时器通信协议管理模块Timer详解的文章就介绍到这了,更多相关Java Timer内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341