【问题标题】:How to do an action in periodic intervals in java?如何在java中定期执行操作?
【发布时间】:2013-07-01 04:00:55
【问题描述】:

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

例如:

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

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

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

【问题讨论】:

    标签: java loops timer


    【解决方案1】:

    使用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 熟悉的 程序员并且可以使处理事件调度线程 简单一点。其次,它的自动线程共享意味着你不需要 必须采取特殊步骤来避免产生太多线程。 相反,您的计时器使用用于使光标闪烁的同一线程, 出现工具提示等。

    【讨论】:

    • “这将每 3 秒运行一次” - 不,它不会;)这也假设用户没有使用某种 GUI 框架跨度>
    • sysout fixed :) @MadProgrammer 为什么你说它假定用户没有使用任何 GUI 框架?这就是我不建议使用javax.swing.Timer的原因吗?
    • 这个问题没有上下文。如果 OP 正在使用 Swing(例如),那么这可能不是一个好主意。考虑到上下文,它仍然是一个有效的答案,但我(个人)声明这假设 OP 没有使用 GUI - 恕我直言
    • 程序是一个图形用户界面。 @fmodos:对我来说效果很好。但是你能简化一下netbeans环境的代码吗:)
    • @user2471839 我不确定您所说的“简化 netbeans 代码”是什么意思,此代码不使用任何第三方库...所以您只需将其复制到您的代码中,无论如何,我将通过使用 javax.swing.Timer 进行编码的示例来更新答案,因为这是一个 GUI。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您正在使用某种用户界面吗?

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-05-10
        • 2016-02-10
        • 2016-04-19
        • 2010-11-05
        • 2018-10-10
        • 2019-07-19
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多