如何在java中定期执行某个操作?

时间:2013-07-01 04:00:56

标签: java loops timer

是否有任何方法可以创建一个循环,每3秒执行一次任务而不使用睡眠功能

例如:

try {
    while (true) {
        System.out.println(new Date());
        Thread.sleep(5 * 1000);
    }
} catch (InterruptedException e) {
    e.printStackTrace();
}

但是使用睡眠功能时的问题是,它只会冻结程序。

  

这个循环的主要思想是与mysql数据库进行同步   (在线)。

3 个答案:

答案 0 :(得分:7)

使用java.util.TimerTask

java.util.Timer t = new java.util.Timer();
t.schedule(new TimerTask() {

            @Override
            public void run() {
                System.out.println("This will run every 5 seconds");

            }
        }, 5000, 5000);

如果您使用的是GUI,则可以使用javax.swing.Timer,例如:

int delay = 5000; //milliseconds
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          System.out.println("This will run every 5 seconds");
      }
  };
  new javax.swing.Timer(delay, taskPerformer).start();

有关java.util.Timerjava.swing.Timer之间区别的一些信息: http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html

  

它和javax.swing.Timer都提供相同的基本功能,   但是java.util.Timer更通用,并且具有更多功能。该   javax.swing.Timer有两个功能,可以使它更容易   与GUI一起使用。首先,它的事件处理隐喻是GUI所熟悉的   程序员可以处理事件派发线程a   有点简单。其次,它的自动线程共享意味着你没有   必须采取特殊步骤,以避免产生太多线程。   相反,你的计时器使用相同的线程来使光标闪烁,   出现工具提示,等等。

答案 1 :(得分:4)

如果您可以在线程内重复执行要重复执行的逻辑,则可以使用其中一个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);
    }
 }

答案 2 :(得分:2)

您使用的是某种UI吗?

Java中至少有两个可用的计时器;

哪个应该能够达到你想要的效果

还有第三方图书馆可能也有帮助