5

有没有办法创建一个循环,每 3 秒执行一次任务,而不使用睡眠功能

例如:

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

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

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

4

3 回答 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.Timer关于和之间区别的一些信息:http java.swing.Timer: //docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html

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

于 2013-07-01T04:04:25.067 回答
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);
    }
 }
于 2013-07-01T04:04:03.043 回答
2

你在使用某种 UI 吗?

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

哪个应该能够实现您想要的

还有 3rd 方库也可能有所帮助

于 2013-07-01T04:03:56.303 回答