1

最后经过一些试验和错误,我设法让它按我的意愿工作。

但是现在我希望您的建议是使代码更具可读性和简单性,似乎制作了很多不必要的代码来归档我想要的东西。

这基本上做的是,如果您在计划任务应该运行的时间打开服务器应用程序,它将启动该任务并让它在它应该开始的剩余时间内运行,否则它将被安排在它应该运行的小时。

因此,如果计划时间是 13:00:00 并且应该运行 120 分钟,而您在 13:30 启动应用程序,它将运行 90 分钟。如果您在该时间之后启动它,通常会安排在第二天 13:00:00。

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);

        long start_time = calendar.getTimeInMillis() - System.currentTimeMillis();

        if (start_time < 0)
        {
            long minutes = (start_time*-1) / (60 * 1000);
            if (minutes > 0 && minutes < 120)
            {
                runTimeLeft = 120 - minutes;
                ThreadPoolManager.getInstance().schedule(new Runnable()
                {
                    public void run()
                    {
                        myTask();
                    }
                }, 0);
            }
            else
                runTimeLeft = 0;

            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, hour+24);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);

            start_time = calendar.getTimeInMillis() - System.currentTimeMillis();
        }

        ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable()
        {
            public void run()
            {
                myTask();
            }
        }, start_time, 24 * 60 * 60 * 1000);

所以我现在的问题是我可以对上面的代码进行哪些改进?

4

2 回答 2

0

与其java.util.Timer单独使用,不如尝试与TimerTask. IBM 有一篇关于此的好文章。

看看这个链接:http ://www.ibm.com/developerworks/java/library/j-schedule.html

该代码也是共享的,似乎适用于琐碎的日常工作。

于 2011-02-24T02:59:07.657 回答
0

将其用于您的第一种方法:

int interval = 24 * 60 * 60 * 1000; // might be long instead of int
ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable()
{
    public void run()
    {
        myTask();
    }
}, interval, interval);

这将创建一个简单的计时器,它将myTask()在 24 小时内调用,然后每 24 小时调用一次。

不过,您的其他要求有点不同。如果我正确理解了您的描述,那么您基本上希望您的应用程序始终在上午 12:00 执行某些任务(如果它恰好启动并运行)。如果您不关心精确到毫秒的精度,您可以通过启动一个一分钟周期的计时器并检查每个滴答声中的当前系统时间来实现它 - 当您点击 12:00 AM运行你的日常任务。

一种更好的方式将涉及与操作系统交互,以便它在预先安排的时间对您的应用程序进行回调(如果需要,甚至可能启动您的应用程序),但这种事情是特定于操作系统/平台的(您没有指定) .

更新: 我对 Linux 一无所知,但看起来cron你正在寻找一份工作。看到这个问题:

在 Linux 服务器上运行用 java 编写的计划任务

于 2011-02-24T03:01:47.697 回答