我正在尝试为循环添加延迟。它不能是thread.sleep()因为它会占用整个线程。我正在尝试使用System.currentTimeMillis()
。我知道它不是100%精确,这很好。
long lastTime = System.currentTimeMillis() - 200;
boolean goAhead = false;
if (System.currentTimeMillis() - lastTime > 201) {
goAhead = true;
}
if (goAhead) {
//Do something
//atm this never happens.
lastTime = System.currentTimeMillis();
}
任何人都可以帮忙吗?
答案 0 :(得分:3)
为什么'睡觉整个帖子'是个问题?无论如何,如果你想忙,请在while
循环中进行。 if
是一枪。
答案 1 :(得分:2)
我可以想象这个问题可能是:
问:我在GUI事件线程上有一个回调,它必须每250毫秒在同一个线程上触发一个动作。我不能在这段时间内拥有GUI线程块,因为它会冻结GUI。我该怎么办?
答:使用执行程序在GUI事件线程上触发任务。
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// task to be perform periodically in the GUI Event Thread.
}
});
}
}, 250, 250, TimeUnit.MILLISECONDS);
执行任务的GUI线程,但执行等待的后台线程。
我会写更像
的东西long time = 0;
while(condition) {
long now = System.nanoTime();
if (now >= time + 200e6) {
// do something
time = now;
}
// do something else
}
在不知道程序的特定要求的情况下,代码可以被读作。
long time = 0; // a local variable or field as appropriate
// you have a loop around all code of interest at some level
// You could have a GUI event loop which you don't define but it is there.
// at some point your checking code is called.
long now = System.nanoTime();
if (now >= time + 200e6) {
// do something
time = now;
}
这不会等待,因为你不想阻止任何东西。相反,它可以防止被调用的代码块间隔超过200毫秒。
int i = 0, count = 0;
long start = System.nanoTime();
long time = 0;
while (count < 20) {
long now = System.nanoTime();
if (now >= time + 200e6) {
// do something e.g.
count++;
time = now;
}
// do something else
}
long runTime = System.nanoTime() - start;
System.out.printf("Performed something at %.3f per second%n", (count - 1) * 1e9 / runTime);
打印
Performed something at 5.000 per second
答案 2 :(得分:2)
它不起作用的原因是
if (System.currentTimeMillis() -lastTime > 201) { goAhead= true; }
执行一次就是这样,你需要将它放入循环中,例如
while (System.currentTimeMillis() -lastTime < 201) {
// wait
}
然而它会给你一个。 100%cpu使用没什么,这是一个糟糕的设计,我相信
答案 3 :(得分:0)
到目前为止,等待的最佳方式是使用Thread.sleep()
(或Object.wait()
超时);它会阻塞线程,但它以可预测的方式执行。如果你绝对必须在等待时做一些事情,要么将sleep 或放在一个单独的线程中,并使用线程间协调原语来同步事物。
final Thread mainthread = Thread.currentThread();
Thread t = new Thread() {
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {}
mainthread.interrupt();
}
}.start();
while (!Thread.interrupted()) {
// Do your other work here...
}
Java中的线程(相对)便宜。使用它们。