每隔10分钟调用一个函数

31

我不是专家,只是一个初学者。所以我恳请您为我编写一些代码。

如果我有两个类,CLASS ACLASS B,并且在CLASS B中有一个名为funb()的函数。 我想每十分钟从CLASS A调用这个函数。

您已经给了我一些想法,但是我还没有完全理解。

您能否提供一些示例代码?


6
我认为在这背后有一个合理的问题;这就是我进行编辑的原因。 - balpha
2
@balpha:你在那里施展了一些魔法 :o - Sam Harwell
5个回答

31

请看ScheduledExecutorService

这里有一个类,其中包含一个方法,该方法设置了一个ScheduledExecutorService,每隔十秒钟响铃一次,持续一个小时:

 import static java.util.concurrent.TimeUnit.*;
 class BeeperControl {
    private final ScheduledExecutorService scheduler =
       Executors.newScheduledThreadPool(1);

    public void beepForAnHour() {
        final Runnable beeper = new Runnable() {
                public void run() { System.out.println("beep"); }
            };
        final ScheduledFuture<?> beeperHandle =
            scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
        scheduler.schedule(new Runnable() {
                public void run() { beeperHandle.cancel(true); }
            }, 60 * 60, SECONDS);
    }
 }

我使用了您从主函数中的代码。但是当任务达到时间限制时,程序并没有退出。如何使程序在任务完成后停止? - Itération 122442
1
运行得非常顺畅。值得一提的是,scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS); 中的第一个10表示在发送第一个beep之前等待的时间,第二个10表示每次beep之间等待的时间,而60*60则表示它将运行的时间长度。 - Slobodan Margetić

18
import java.util.Date;

import java.util.Timer;

import java.util.TimerTask;

public class ClassExecutingTask {

    long delay = 10 * 1000; // delay in milliseconds
    LoopTask task = new LoopTask();
    Timer timer = new Timer("TaskName");

    public void start() {
        timer.cancel();
        timer = new Timer("TaskName");
        Date executionDate = new Date(); // no params = now
        timer.scheduleAtFixedRate(task, executionDate, delay);
    }

    private class LoopTask extends TimerTask {
        public void run() {
            System.out.println("This message will print every 10 seconds.");
        }
    }

    public static void main(String[] args) {
        ClassExecutingTask executingTask = new ClassExecutingTask();
        executingTask.start();
    }


}

TimerTask已经过时,现已被ExecutorService及其相关实现所取代。 - skaffman
2
真的吗?找不到任何相关信息。我很想看看你的来源。谢谢! :) - Philippe Carriere
这个问题/答案证实了Skaffman的说法:https://dev59.com/-HRC5IYBdhLWcg3wG9Jb - Philippe Carriere

14

试试这个。它将每隔一定时间重复运行 run() 函数。要更改设置的分钟数,请更改 MINUTES 变量。

int MINUTES = 10; // The delay in minutes
Timer timer = new Timer();
 timer.schedule(new TimerTask() {
    @Override
    public void run() { // Function runs every MINUTES minutes.
        // Run the code you want here
        CLASSB.funcb(); // If the function you wanted was static
    }
 }, 0, 1000 * 60 * MINUTES);
    // 1000 milliseconds in a second * 60 per minute * the MINUTES variable. 

不要忘记进行导入!

import java.util.Timer;
import java.util.TimerTask;

更多信息请前往:

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


4

Java 8 解决方案

ClassB b = new ClassB();    
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
Runnable task = () -> {
    b.funb();
};
executor.scheduleWithFixedDelay(task, 0, 10, TimeUnit.MINUTES);

4
public class datetime {

    public String CurrentDate() {

        java.util.Date dt = new java.util.Date();
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        String currentTime = sdf.format(dt);
        return currentTime;

    }

    public static void main(String[] args) {
        class SayHello extends TimerTask {

            datetime thisObj = new datetime();

            public void run() {
                String todaysdate = thisObj.CurrentDate();
                System.out.println(todaysdate);
            }
        }
        Timer timer = new Timer();
        timer.schedule(new SayHello(), 0, 5000); 
    }
}

类名不符合Java规范。 - Skere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接