是否有任何方法可以创建一个循环,每3秒执行一次任务而不使用睡眠功能
例如:
try {
while (true) {
System.out.println(new Date());
Thread.sleep(5 * 1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
但是使用睡眠功能时的问题是,它只会冻结程序。
这个循环的主要思想是与mysql数据库进行同步 (在线)。
答案 0 :(得分: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
和java.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所熟悉的 程序员可以处理事件派发线程a 有点简单。其次,它的自动线程共享意味着你没有 必须采取特殊步骤,以避免产生太多线程。 相反,你的计时器使用相同的线程来使光标闪烁, 出现工具提示,等等。
答案 1 :(得分: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 :(得分:2)