小伙伴们知道java定时器timer吗?本篇文章小编就来带大家了解一下它的概念及实现方法。
通俗的说,我们可以将Timer当成是一种工具,线程会用它安排以后在后台线程中执行的任务。嫩够安排任务执行一次或定期重复执行。但实际上它就是个线程,只是定时调度所拥有的TimerTasks而已。
TimerTask具体来说就是一个抽象类,它的子类会由 Timer 安排一次执行或重复执行的任务。实际上就是一个拥有run方法的类,只是将需要定时执行的代码放到run方法体内。
实现
private Set < Integer > 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基础的详细知识可以关注我们来了解详情。
推荐阅读: