我希望我的代码每5秒运行一次,例如使用:
try {
Thread.sleep(5000);
} catch (InterruptedException ie) {
//Handle exception
}
然而,在这周围设置一个while
循环并不总是不好的做法总是每隔5秒就会发生一次,或者这样可以吗?
答案 0 :(得分:5)
使用预定的执行者:
ScheduledExecutorService pool = Executors.newScheduledThreadPool(4);
pool.scheduleAtFixedRate(() -> { System.out.println("Hello World"); }, 0l, 5l, TimeUnit.SECONDS);
答案 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.sleep
受spurious 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。