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

5

有没有一种方法可以创建一个循环,在不使用sleep函数的情况下每3秒执行一次任务

例如:

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

但是使用sleep函数的问题在于,它会冻结程序。
这个循环的主要目的是与mysql数据库(在线)同步。
3个回答

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.Timerjavax.swing.Timer的区别:
两者提供相同的基本功能,但java.util.Timer更通用,具有更多特性。而javax.swing.Timer有两个特性,使它在GUI方面更易用。首先,它的事件处理方式熟悉于GUI开发人员,并且可以使处理事件分派线程变得更简单。其次,它的自动线程共享意味着您不需要采取特殊措施来避免产生太多的线程。相反,您的计时器将使用与制作光标闪烁、显示工具提示等相同的线程。 相关文档

1
"这将每3秒运行一次" - 不,它不会 ;) 这也假设用户没有使用某种GUI框架。 - MadProgrammer
1
这个问题没有上下文。如果 OP 使用 Swing(例如),那么这可能不是一个好主意。鉴于上下文,这仍然是一个有效的答案,但我个人认为这假设 OP 没有使用 GUI - 在我看来。 - MadProgrammer
该程序是一个GUI。@fmodos:对我来说运行得很好。但你能简化一下在NetBeans环境下的代码吗 :) - Sarang
@fmodos 我需要执行以下语句而不是: System.out.println("This will run every 5 seconds");textarea.append("This will run every 5 seconds\n");但问题是,我无法使用textarea,因为它尚未创建。你能给我一个解决这个问题的建议吗? - Sarang
@user2471839 你可能会发现SwingWorker更适合这个任务。 - MadProgrammer
显示剩余4条评论

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

您是否使用了某种UI界面?

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

这两个计时器都可以实现您想要的功能。

此外,还有第三方库可能会有所帮助。


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