每小时运行一次java函数

Posted

技术标签:

【中文标题】每小时运行一次java函数【英文标题】:Run java function every hour 【发布时间】:2015-11-20 14:16:07 【问题描述】:

我想每小时运行一个函数,每小时通过电子邮件向用户发送他们进度的屏幕截图。我在一个名为 sendScreenshot() 的函数中进行了代码设置

如何在后台运行此计时器以每小时调用一次函数 sendScreenshot(),而程序的其余部分正在运行?

这是我的代码:

public int onLoop() throws Exception
    if(getLocalPlayer().getHealth() == 0)
        playerHasDied();
    
    return Calculations.random(200, 300);



public void sendScreenShot() throws Exception
    Robot robot = new Robot();
    BufferedImage screenshot = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
    screenshotNumber = getNewestScreenshot();
    fileName = new File("C:/Users/%username%/Dreambot/Screenshots/Screenshot" + screenshotNumber +".");
    ImageIO.write(screenshot, "JPEG", fileName);

    mail.setSubject("Your hourly progress on account " + accName);
    mail.setBody("Here is your hourly progress report on account " + accName +". Progress is attached in this mail.");
    mail.addAttachment(fileName.toString());
    mail.setTo(reciepents);
    mail.send();


【问题讨论】:

您可以使用计时器。您可以使用一些库来执行此操作... 你最好使用调度器:docs.oracle.com/javase/7/docs/api/java/util/concurrent/… 这里已经回答了***.com/questions/4044729/java-timer-task-schedule 【参考方案1】:

使用ScheduledExecutorService

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
ses.scheduleAtFixedRate(new Runnable() 
    @Override
    public void run() 
        sendScreenShot();
    
, 0, 1, TimeUnit.HOURS);

优先使用ScheduledExecutorService 而不是Timer: Java Timer vs ExecutorService?

【讨论】:

我怎样才能让它像作为后台服务运行一样,这样即使在计算机启动时应用程序也没有运行,但线程在其定义的时间自动运行? @A.Aleem11 如果您想要免费和开源的东西,请使用 Quartz Scheduler 或我们的 Obsidian Scheduler。 更短,使用 Java 8:Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> sendScreenShot(), 0, 1, TimeUnit.HOURS)【参考方案2】:

根据this article by Oracle,也可以使用@Schedule注解:

@Schedule(hour = "*")
public void doSomething() 
    System.out.println("hello world");

例如,秒和分钟的值可以是 0-59、小时 0-23、月 1-12。

那里还描述了其他选项。

【讨论】:

这是给 JEE 的,他很可能在使用 JSE 我猜这是最优雅的方式。谢谢。【参考方案3】:

java 的 Timer 在这里可以正常工作。

http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html

Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() 
    public void run() 
        // ...
    
, delay, 1 * 3600 * 1000); // 1 hour between calls

【讨论】:

但这需要一些查看注释的上下文,例如企业服务器、spring 等。 @user1052080 此解决方案不需要任何注释。【参考方案4】:

对于这种类型的周期执行,即每天或每小时,您只需要使用这样的计时器:

public static void main(String[] args) throws InterruptedException 
        Calendar today = Calendar.getInstance();
        today.set(Calendar.HOUR_OF_DAY, 7);
        today.set(Calendar.MINUTE, 45);
        today.set(Calendar.SECOND, 0);

        Timer timer = new Timer();
        TimerTask task = new TimerTask() 
            @Override
            public void run() 
                System.out.println("I am the timer");
            
        ;
//        timer.schedule(task, today.getTime(), TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)); // period: 1 day
        timer.schedule(task, today.getTime(), TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS)); // period: 5 seconds

    

此示例将从当前日期和上午 7:45 开始每 5 秒执行一次 timetask。 祝你好运。

【讨论】:

【参考方案5】:
while (true) 
        
        DateTime d = new DateTime();
        switch(d.getMinuteOfHour()) 
            
        case 56:
            runHourly();
            break;
            
        case 41:
            if(d.getHourOfDay() == 2) 
                runAt0241Daily();
            
            break;
           
        SUM.wait(59000);
    

这对于你可以控制和理解的东西怎么样?

【讨论】:

以上是关于每小时运行一次java函数的主要内容,如果未能解决你的问题,请参考以下文章

如何安排一个函数在 Flask 上每小时运行一次?

大家好 在linux上运行一个java程序 程序是一个死循环每10分钟循环一次 大概20个小时左右程序就不再运行

java中如何每隔一段时间执行一个函数

如何使用命令行检查Java类的异常终止

用java的Quartz包定时调用方法,我想实现每隔一个半小时调用一次方法, 请问Corn表达式怎么写?

每 24 小时运行一个 php 任务