近日要做定时任务,看了看java.util.Timer源码,Timer类中有以下三个变量:
private TaskQueue queue = new TaskQueue();
/**
* The timer thread.
*/
private TimerThread thread = new TimerThread(queue);
/**
* This object causes the timer's task execution thread to exit
* gracefully when there are no live references to the Timer object and no
* tasks in the timer queue. It is used in preference to a finalizer on
* Timer as such a finalizer would be susceptible to a subclass's
* finalizer forgetting to call it.
*/
private Object threadReaper = new Object() {
protected void finalize() throws Throwable {
synchronized(queue) {
thread.newTasksMayBeScheduled = false;
queue.notify(); // In case queue is empty.
}
}
};
其中thread变量在timer初始化后开始启动,其start就是一个while(true)循环,不断取得queue中任务进行判断。。那么thread线程退出就是个问题了,当然Timer提供了cancel方法。
当quene变为了空,而这个timer类没有再被引用,那么如果不执行cancel则这个线程一直运行状态。当垃圾回收的时候,while(true)一直运行,所以不会退出。因此当timer进行回收时候,threadReaper 对象回收了,其finalize方法将queue清空,标识变量false,这样while循环中的判断break条件为真,退出循环,函数执行完毕了,线程也会退出了。
如果timer类不使用了,一定要cancel掉,否则等到垃圾回收线程才能退出。
分享到:
相关推荐
VC 多线程时间计时器timer源码演示,两个时间计时线程分别运行于各自的线程中,互不影响,可点击按钮控制两个线程同进结束,本源码可向初学者演示如何创建多线程、计时器的使用等,调试环境为VC .NET。
我写的Linux版Timer定时器(源码),可在多线程间使用 Linux没有Timer,QT的timer又不支持多线程,是线程间不安全的 于是我自己写了个Linux下的Timer类
关于winform使用timer进行多线程操作的例子 一个关于网段ping的例子 很好的解释了system.timers.timer的用法
Timer控件的简单用法实例,实时显示时间程序,初学者适合
使用System.Threading.Timer 使用System.Timers.Timer 分别举例这两个类来实现多线程的时钟,不会阻塞UI线程 例子是Winform的
单片机C语言程序设计 TIMER0与TIMER1控制条形LED(有源码)单片机C语言程序设计 TIMER0与TIMER1控制条形LED(有源码)单片机C语言程序设计 TIMER0与TIMER1控制条形LED(有源码)单片机C语言程序设计 TIMER0与TIMER1控制...
模拟多线程,众所周知,vb本身并不支持多线程,笨程序是利用外部API加本地Timer对多线程进行实现
细细品味C# (Timer及多线程编程)
用vc实现的基于线程的定时器Timer,通常vc++的定时器timer是基于窗体的,由窗体消息驱动,而本程序实现的timer是基于线程的,不用windows消息驱动,而是基于线程事件驱动的
自己编写的Delphi组件定时器Timer,内支持线程,不会像D原生那样卡顿及界面.
C#多线程定时调用,类似timer,比timer更轻量级
高精度MFC_Timer定时源码 高精度MFC_Timer定时源码 高精度MFC_Timer定时源码 高精度MFC_Timer定时源码
单片机C语言程序设计 TIMER0控制流水灯(有源码)单片机C语言程序设计 TIMER0控制流水灯(有源码)单片机C语言程序设计 TIMER0控制流水灯(有源码)单片机C语言程序设计 TIMER0控制流水灯(有源码)单片机C语言程序设计 ...
visual c++ VC中TIMER与多线程的对比.zip TIMER与线程的对比:用TIMER就显慢,因为TIMER是在主线程中的,即共用一线程,用多线程就快多了
详细讲解了 C#里现有的3 个Timer 类及范例,Socket网络编程及范例,多线程编程及范例,以及断点续传、多线程上载等等,值得一看。
单片机C语言程序设计 TIMER0控制单只LED闪烁(有源码)单片机C语言程序设计 TIMER0控制单只LED闪烁(有源码)单片机C语言程序设计 TIMER0控制单只LED闪烁(有源码)单片机C语言程序设计 TIMER0控制单只LED闪烁(有源码)...
单片机C语言程序设计 TIMER0控制LED二进制计数(有源码)单片机C语言程序设计 TIMER0控制LED二进制计数(有源码)单片机C语言程序设计 TIMER0控制LED二进制计数(有源码)单片机C语言程序设计 TIMER0控制LED二进制计数...
基本涵盖java多线程的概念,适合初学者
good timer for use in your life
原创作品,因为自己一个项目需要用到大文件下载,在网上找了很久没有找到VB.NET下载大文件的实例,所以自己写了这个,采用多线程控制,带进度条和当前下载速度计算。 源码中包含有大量中文注释,也非常适合初学者...