一个java定时器框架

时间:2021-09-29 23:29:23

ScheduleIterator接口

一个java定时器框架import java.util.Date;
一个java定时器框架
一个java定时器框架
public   interface  ScheduleIterator 
一个java定时器框架一个java定时器框架
{
一个java定时器框架    
public Date next();//获取下一个触发的时间点
一个java定时器框架
}

一个java定时器框架

Scheduler

一个java定时器框架import java.util.Date;
一个java定时器框架import java.util.Timer;
一个java定时器框架import java.util.TimerTask;
一个java定时器框架
一个java定时器框架
一个java定时器框架
public   class  Scheduler 
一个java定时器框架一个java定时器框架
{
一个java定时器框架    
class SchedulerTimerTask extends TimerTask 
一个java定时器框架一个java定时器框架    
{
一个java定时器框架        
private SchedulerTask schedulerTask;
一个java定时器框架        
private ScheduleIterator iterator;
一个java定时器框架        
public SchedulerTimerTask(SchedulerTask schedulerTask,ScheduleIterator iterator)
一个java定时器框架一个java定时器框架        
{
一个java定时器框架            
this.schedulerTask = schedulerTask;
一个java定时器框架            
this.iterator = iterator;
一个java定时器框架        }

一个java定时器框架        
public void run() 
一个java定时器框架一个java定时器框架        
{
一个java定时器框架            schedulerTask.run();
一个java定时器框架            reschedule(schedulerTask, iterator);
一个java定时器框架        }

一个java定时器框架    }

一个java定时器框架
一个java定时器框架    
private final Timer timer = new Timer();
一个java定时器框架
一个java定时器框架    
public Scheduler() 
一个java定时器框架一个java定时器框架    
{
一个java定时器框架    }

一个java定时器框架    
public void cancel() 
一个java定时器框架一个java定时器框架    
{
一个java定时器框架        timer.cancel();
一个java定时器框架    }

一个java定时器框架    
public void schedule(SchedulerTask schedulerTask,ScheduleIterator iterator) 
一个java定时器框架一个java定时器框架    
{
一个java定时器框架        Date time 
= iterator.next();
一个java定时器框架        
if (time == null
一个java定时器框架一个java定时器框架        
{
一个java定时器框架            schedulerTask.cancel();
一个java定时器框架        }

一个java定时器框架        
else 
一个java定时器框架一个java定时器框架        
{
一个java定时器框架            synchronized(schedulerTask.
lock)
一个java定时器框架一个java定时器框架            
{
一个java定时器框架                
if (schedulerTask.state != SchedulerTask.VIRGIN) 
一个java定时器框架一个java定时器框架                
{
一个java定时器框架                    
throw new IllegalStateException("Task already scheduled " +
一个java定时器框架                        
"or cancelled");
一个java定时器框架                }

一个java定时器框架                schedulerTask.state 
= SchedulerTask.SCHEDULED;
一个java定时器框架                schedulerTask.timerTask 
= new SchedulerTimerTask(schedulerTask, iterator);
一个java定时器框架                timer.schedule(schedulerTask.timerTask, time);
一个java定时器框架            }

一个java定时器框架        }

一个java定时器框架    }

一个java定时器框架
一个java定时器框架    
private void reschedule(SchedulerTask schedulerTask,ScheduleIterator iterator)
一个java定时器框架一个java定时器框架    
{
一个java定时器框架        Date time 
= iterator.next();
一个java定时器框架        
if (time == null)
一个java定时器框架一个java定时器框架        
{
一个java定时器框架            schedulerTask.cancel();
一个java定时器框架        }
 
一个java定时器框架        
else 
一个java定时器框架一个java定时器框架        
{
一个java定时器框架            synchronized(schedulerTask.
lock)
一个java定时器框架一个java定时器框架            
{
一个java定时器框架                
if (schedulerTask.state != SchedulerTask.CANCELLED) 
一个java定时器框架一个java定时器框架                
{
一个java定时器框架                    schedulerTask.timerTask 
= new SchedulerTimerTask(schedulerTask, iterator);
一个java定时器框架                    timer.schedule(schedulerTask.timerTask, time);
一个java定时器框架                }

一个java定时器框架            }

一个java定时器框架        }

一个java定时器框架    }

一个java定时器框架}

一个java定时器框架

SchedulerTask

一个java定时器框架import java.util.TimerTask;
一个java定时器框架
一个java定时器框架
public   abstract   class  SchedulerTask implements Runnable 
一个java定时器框架一个java定时器框架
{//被调度器不断调度执行的任务
一个java定时器框架

一个java定时器框架    final Object 
lock = new Object();
一个java定时器框架
一个java定时器框架    
int state = VIRGIN;//任务状态
一个java定时器框架
    static final int VIRGIN = 0;
一个java定时器框架    
static final int SCHEDULED = 1;
一个java定时器框架    
static final int CANCELLED = 2;
一个java定时器框架
一个java定时器框架    TimerTask timerTask;
//底层的定时器任务
一个java定时器框架
    protected SchedulerTask() 
一个java定时器框架一个java定时器框架    
{
一个java定时器框架    }

一个java定时器框架    
public abstract void run();//调度任务执行的具体任务
一个java定时器框架
    public boolean cancel() 
一个java定时器框架一个java定时器框架    
{
一个java定时器框架        synchronized(
lock
一个java定时器框架一个java定时器框架        
{
一个java定时器框架            
if (timerTask != null
一个java定时器框架一个java定时器框架            
{
一个java定时器框架                timerTask.cancel();
//取消任务
一个java定时器框架
            }

一个java定时器框架            boolean result 
= (state == SCHEDULED);//任务已经被调度执行
一个java定时器框架
            state = CANCELLED;//设置任务状态为“取消”
一个java定时器框架
            return result;
一个java定时器框架        }

一个java定时器框架    }

一个java定时器框架    
public long scheduledExecutionTime()
一个java定时器框架一个java定时器框架    
{
一个java定时器框架        synchronized(
lock
一个java定时器框架一个java定时器框架        
{
一个java定时器框架            
return timerTask == null ? 0 : timerTask.scheduledExecutionTime();//任务执行时间
一个java定时器框架
        }

一个java定时器框架    }

一个java定时器框架
一个java定时器框架}

一个java定时器框架

DailyIterator类:

一个java定时器框架import java.util.Calendar;
一个java定时器框架import java.util.Date;
一个java定时器框架
一个java定时器框架一个java定时器框架
public   class  DailyIterator implements ScheduleIterator  {
一个java定时器框架    
private final int hourOfDay, minute, second;
一个java定时器框架    
private final Calendar calendar = Calendar.getInstance();
一个java定时器框架
一个java定时器框架    
public DailyIterator(int hourOfDay, int minute, int second)
一个java定时器框架一个java定时器框架    
{
一个java定时器框架        
this(hourOfDay, minute, second, new Date());
一个java定时器框架    }

一个java定时器框架
一个java定时器框架    
public DailyIterator(int hourOfDay, int minute, int second, Date date)
一个java定时器框架一个java定时器框架    
{
一个java定时器框架        
this.hourOfDay = hourOfDay;
一个java定时器框架        
this.minute = minute;
一个java定时器框架        
this.second = second;
一个java定时器框架        calendar.setTime(date);
一个java定时器框架        calendar.
set(Calendar.HOUR_OF_DAY, hourOfDay);
一个java定时器框架        calendar.
set(Calendar.MINUTE, minute);
一个java定时器框架        calendar.
set(Calendar.SECOND, second);
一个java定时器框架        calendar.
set(Calendar.MILLISECOND, 0);
一个java定时器框架        
if (!calendar.getTime().before(date)) 
一个java定时器框架一个java定时器框架        
{
一个java定时器框架            calendar.add(Calendar.DATE, 
-1);
一个java定时器框架        }

一个java定时器框架    }

一个java定时器框架
一个java定时器框架    
public Date next()
一个java定时器框架一个java定时器框架    
{//获取下一个触发的时间点
一个java定时器框架
        calendar.add(Calendar.DATE, 1);
一个java定时器框架        
return calendar.getTime();
一个java定时器框架    }

一个java定时器框架
一个java定时器框架}

一个java定时器框架
一个java定时器框架

测试类:

一个java定时器框架import java.text.SimpleDateFormat;
一个java定时器框架
一个java定时器框架import java.util.Date;
一个java定时器框架
一个java定时器框架import org.tiling.scheduling.Scheduler;
一个java定时器框架import org.tiling.scheduling.SchedulerTask;
一个java定时器框架import org.tiling.scheduling.examples.iterators.DailyIterator;
一个java定时器框架
一个java定时器框架
public   class  AlarmClock 
一个java定时器框架一个java定时器框架
{
一个java定时器框架
一个java定时器框架    
private final Scheduler scheduler = new Scheduler();//调度器
一个java定时器框架
    private final SimpleDateFormat dateFormat =
一个java定时器框架        
new SimpleDateFormat("dd MMM yyyy HH:mm:ss.SSS");
一个java定时器框架    
private final int hourOfDay, minute, second;//每天触发的时间点 
一个java定时器框架

一个java定时器框架    
public AlarmClock(int hourOfDay, int minute, int second) 
一个java定时器框架一个java定时器框架    
{
一个java定时器框架        
this.hourOfDay = hourOfDay;
一个java定时器框架        
this.minute = minute;
一个java定时器框架        
this.second = second;
一个java定时器框架    }

一个java定时器框架
一个java定时器框架    
public void start() 
一个java定时器框架一个java定时器框架    
{
一个java定时器框架        scheduler.schedule(
new SchedulerTask() 
一个java定时器框架一个java定时器框架        
{
一个java定时器框架            
public void run() 
一个java定时器框架一个java定时器框架            
{
一个java定时器框架                soundAlarm();
一个java定时器框架            }

一个java定时器框架            
private void soundAlarm()
一个java定时器框架一个java定时器框架            
{
一个java定时器框架                System.
out.println("Wake up! " +
一个java定时器框架                    
"It's " + dateFormat.format(new Date()));
一个java定时器框架                
// Start a new thread to sound an alarm一个java定时器框架
一个java定时器框架
            }

一个java定时器框架        }
new DailyIterator(hourOfDay, minute, second));//通过迭代器模式迭代遍历得到后面一系列的时间点
一个java定时器框架
    }

一个java定时器框架
一个java定时器框架    
public static void main(String[] args) 
一个java定时器框架一个java定时器框架    
{
一个java定时器框架        AlarmClock alarmClock 
= new AlarmClock(2250);
一个java定时器框架        alarmClock.start();
一个java定时器框架    }

一个java定时器框架}

一个java定时器框架

参考资料

Scheduling recurring tasks in Java applications