代码之家  ›  专栏  ›  技术社区  ›  Simon Gibbs

我需要在爪哇睡很长时间(几天)。

  •  3
  • Simon Gibbs  · 技术社区  · 15 年前

    我有一个应用程序需要在一个时间表上做一件事,而且只有一件事,它将能够很容易地计算出它下一次需要运行的时间。它可能不需要在几天或几个月后运行此任务,但可能每隔几毫秒就会在其他方面处于活动状态。

    我正在寻找一种简单、轻量级的方法来调度要运行的任务。

    6 回复  |  直到 15 年前
        1
  •  4
  •   Glen    15 年前

    如果您的Java应用程序打算连续运行,那么您可以使用 Timer 按计划执行的类

    如果你的应用程序不能持续运行,那么其他答案是正确的。cron/task scheduler是一个不错的选择。

        2
  •  11
  •   Aaron Digulla    15 年前

    在UNIX上,查看系统工具 cron at .

    在Windows上,系统设置中有一个作业调度程序。

    对于一个简单的Java解决方案,请尝试 Timer API .

    对于更复杂的Java唯一解决方案,请参见 quartz .

        3
  •  1
  •   Daniil    15 年前

    如果你需要你的应用在特定时间运行,你可以安排一个cron作业。或者,您可以编写一个简单的类,它将在特定的时间内调度自己。因为我不知道外面有什么图书馆(从来没有真正需要找),我很久以前就写了一个班为自己安排一个任务。希望它能有所帮助,在棒球场:

    import java.util.*;
    
    public abstract class TimeMonitor extends Thread
        {
            protected double execution_time;
            protected boolean execute_at_startup;
    
            public TimeMonitor()
                {
                    execute_at_startup = false;
                }
    
            public TimeMonitor(double time)
                {
                    execution_time = time;
                    execute_at_startup = false;
                }
    
            public void startTimer()
                {
                    setPriority(Thread.MIN_PRIORITY);
                    start();
                }
    
            public void setTime(double time)
                {
                    execution_time = time;
                }
    
            public void executeAtStartup()
                {
                    execute_at_startup = true;
                }
    
            public void run()
                {
                    if (execute_at_startup)
                        doTimedAction();
    
                    while (true)
                        {
                            long runtime = (long)(execution_time * 3600 * 1000);
                            long now     = getTime();
                            long sleep   = 0;
    
                            // Calculate how long to way until first run
                            if (runtime > now)
                                sleep = runtime - now;
                            else
                                sleep = 24 * 3600 * 1000 - now + runtime;
    
                            try
                                {
                                    Thread.sleep(sleep);
                                }
                            catch (InterruptedException e)
                                {
                                    logError("Wait thread has been interrupted.", e);
                                    continue;
                                }
    
                            doTimedAction();
                        }
                }
    
            /**
             * Calculates number of milliseconds from start of the day.
             *
             * @return Number of milliseconds.
             */
            private long getTime()
                {
                    Calendar cal = Calendar.getInstance();
                    int hours   = cal.get(Calendar.HOUR_OF_DAY);
                    int minutes = cal.get(Calendar.MINUTE);
                    int seconds = cal.get(Calendar.SECOND);
                    int millis  = cal.get(Calendar.MILLISECOND);
    
                    return (hours * 3600 + minutes * 60 + seconds) * 1000 + millis;
                }
    
            private void doTimedAction()
                {
                    try
                        {
                            performAction();
                        }
                    catch (Throwable e)
                        {
                            logError("An error occured during timed execution.", e);
                        }
                }
    
            /**
             * This method will be called when an error or a warning occures.
             *
             * @param msg
             * @param e
             */
            protected void logError(String msg, Throwable e)
                {
                    System.out.println(msg);
                    e.printStackTrace();
                }
    
            /**
             * Action to be performed when scheduled time happens.
             */
            protected abstract void performAction();
        }
    

    扩展到这样的用途:

            TimeMonitor archiver = new TimeMonitor()
                {
                    protected void performAction()
                        {
                            // Do the task
                        }
                };
    
            archiver.setTime(16.5); // Run at 4:30pm
            archiver.startTimer();
    
        4
  •  1
  •   stevedbrown    15 年前

    Quartz 适合这种类型的东西。它是 supported well in Spring 还有应用程序。

        6
  •  0
  •   Simon Gibbs    15 年前

    只需使用java.util.concurrent,它就有一个预定的执行小部件。您需要添加一个保护条件来防止过度运行,或者在当前运行结束时添加下一个执行。