queue为一个队列,我们先不看他数据结构,看到他在做这个操作的时候,发生了同步,所以在timer级别,这个是线程安全的,最后将task相关的参数赋值,主要包含nextExecutionTime(下一次执行时间),period(时间片),state(状态),然后将它放入queue队列中,做一次notify操作,为什么要做notify操作呢?看了后面的代码你就知道了。
简言之,这里就是讲task放入队列queue的过程,此时,你可能对queue的结构有些兴趣,那么我们先来看看queue属性的结构TaskQueue:
class TaskQueue {
private TimerTask[] queue = new TimerTask[128];
private int size = 0;
可见,TaskQueue的结构很简单,为一个数组,加一个size,有点像ArrayList,是不是长度就128呢,当然不 是,ArrayList可以扩容,它可以,只是会造成内存拷贝而已,所以一个Timer来讲,只要内部的task个数不超过128是不会造成扩容的;内部 提供了add(TimerTask)、size()、getMin()、get(int)、removeMin()、quickRemove(int)、 rescheduleMin(long newTime)、isEmpty()、clear()、fixUp()、fixDown()、heapify();
--------------------------------------------------------------------------------
实践部分:
1、通过继承TimerTask的方式实现
必须重写run方法.
public class MyTask extends TimerTask
{
@Override
public void run()
{
SimpleDateFormat sdf = null;
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println("当前时间:" + sdf.format(new Date()));
}
}
public class TestTask
{
public static void main(String[] args)
{
Timer t = new Timer(); // 建立Timer对象
MyTask task = new MyTask(); //定义任务
t.schedule(task, 1000,2000);//设置任务的执行,1秒后开始,每2秒执行一次
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MINUTE, 30);
t.schedule(task, cal.getTime() , 2000);
}
}
2、通过匿名内部类实现
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("abc");
}
}, 1000 , 1000);