小伙伴们知道java定时器timer吗?本篇文章小编就来带大家了解一下它的概念及实现方法。
通俗的说,我们可以将Timer当成是一种工具,线程会用它安排以后在后台线程中执行的任务。嫩够安排任务执行一次或定期重复执行。但实际上它就是个线程,只是定时调度所拥有的TimerTasks而已。
TimerTask具体来说就是一个抽象类,它的子类会由 Timer
安排一次执行或重复执行的任务。实际上就是一个拥有run方法的类,只是将需要定时执行的代码放到run方法体内。
实现private Set unitTimeSet = new HashSet (24); //每天更新整点数,把已经检查的时间记录下来
public void checkDeviceDeopped()
{
Calendar calendar = Calendar.getInstance();
//此时要在 第一次执行定时任务的时间加一小时,以便此任务在下个时间点执行。
calendar.add(Calendar.HOUR_OF_DAY, 1);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
java.util.Date date = calendar.getTime(); //第一次执行定时任务的时间
Timer timer = new Timer(true);
timer.schedule(new TimerTask()
{
public void run()
{
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
if (hour == 0)
{
unitTimeSet.clear();
}
if (hour % unitTime == 0 && !unitTimeSet.contains(hour))
{
Session session = sessionFactory.openSession();
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
java.util.Date endTime = cal.getTime();
cal.add(Calendar.HOUR_OF_DAY, -1);
java.util.Date startTime = cal.getTime();
for (String deviceId: mapNvr.keySet())
{
//查询设备在指定时间内的掉线次数
Integer offLineNum = 0;
try
{
offLineNum = (Integer) session.createQuery("SELECT COUNT(*) FROM SystemLog WHERE workerid= :deviceId AND dt<= :endTime AND dt>= :startTime ")
.setParameter("deviceId", deviceId)
.setParameter("endTime", endTime, TemporalType.TIMESTAMP)
.setParameter("startTime", startTime, TemporalType.TIMESTAMP)
.uniqueResult();
}
catch (Exception e)
{
e.printStackTrace();
}
if (offLineNum >= 10)
{
//发送邮件
try
{
CompletableFuture.runAsync(() - >
{
sendMail("NUM", deviceId);
});
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
unitTimeSet.add(hour);
}
}, date, 60 * 60 * 1000);
}
以上就是本篇文章的所有内容,更多有关java基础的详细知识可以关注我们来了解详情。
推荐阅读: