java定时器timer是什么?该如何实现?

TheDisguiser 2020-08-26 21:42:57 java常见问答 4200

小伙伴们知道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基础的详细知识可以关注我们来了解详情。

推荐阅读:

spring定时器原理是什么?

spring定时器注解如何配置?如何使用?

spring定时器时间配置有什么规则?如何实现?