代码之前的Java延迟

时间:2012-09-15 11:10:16

标签: java multithreading

我正在尝试为循环添加延迟。它不能是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();
}

任何人都可以帮忙吗?

4 个答案:

答案 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中的线程(相对)便宜。使用它们。