Java Timer(定时调用、实现固定时间执行)(3)

  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);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b086d52ad23b6fcd2b747a22e47e91e3.html