每隔5秒运行一次代码是不是很糟糕?

时间:2014-07-13 19:55:56

标签: java loops

我希望我的代码每5秒运行一次,例如使用:

    try {
        Thread.sleep(5000);
    } catch (InterruptedException ie) {
          //Handle exception
    }

然而,在这周围设置一个while循环并不总是不好的做法总是每隔5秒就会发生一次,或者这样可以吗?

4 个答案:

答案 0 :(得分:5)

使用预定的执行者:

ScheduledExecutorService pool = Executors.newScheduledThreadPool(4);
pool.scheduleAtFixedRate(() -> { System.out.println("Hello World"); }, 0l, 5l, TimeUnit.SECONDS);

Click for the documentation of the ScheduledExecutorService

答案 1 :(得分:0)

我会使用执行者:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    Runnable toRun = new Runnable() {
        public void run() {
            System.out.println("your code...");
        }
    };
ScheduledFuture<?> handle = scheduler.scheduleAtFixedRate(toRun, 1, 1, TimeUnit.SECONDS);

正如您在while循环中所说的那样:

while(true)
 {
     try {
        Thread.sleep(5000); // Waiting before run.
        // Actual work goes here.
     } catch (InterruptedException ie) {
          //Handle exception
     }
 }

或者甚至使用计时器:

Timer timer = new Timer();
int timeinterval = 10 * 1000;
timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
    //This code is executed at every interval defined by timeinterval (eg 2 seconds)
  }
}, timeinterval);

答案 2 :(得分:0)

我经常做这样的事情:

while(!Thread.currentThread().isInterrupted()) {
    // do something
    Thread.sleep(DELAY);
}

实际上它与while(true)没什么不同,因为如果线程被中断,循环最多会再运行一次,然后sleep()会抛出InterruptedException

但条件记录了意图。

答案 3 :(得分:0)

对此使用while循环被认为是不好的做法,因为这个级别太低了。 Thread.sleepspurious wakeups约束,这会导致某些时间以错误的间隔运行任务。

&#34;漂移&#34;也存在问题。据推测,您的任务需要比0ms更长的时间才能运行。因此,如果您想要运行任务,从5s开始,那么这个开始时间就会漂移。

最佳做法是使用java.lang.Timer(而非javax.swing.Timer)来运行任务。

final Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        //do studff
    }
}, 0, TimeUnit.SECONDS.toMillis(5));

ScheduledExecutorService,它更灵活,因为它可以让您更轻松地安排和取消任务。

final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
ScheduledFuture<?> handle = executorService.scheduleAtFixedRate(() -> System.out.println(), 0, 5, TimeUnit.SECONDS);

第二个例子使用lambda。