如何在java中组合Thread.sleep和while循环?

时间:2017-08-04 16:06:28

标签: java timer while-loop milliseconds

我想将一个while循环与Thread.sleep结合起来,因此代码将在java中每隔纳秒或微秒运行一次。有人能帮我吗?抱歉我的英语不好,我是荷兰人。

2 个答案:

答案 0 :(得分:3)

你不能睡一微秒,只需要检查时间需要几纳秒。

如果你想等待一秒钟,你需要忙等待。注意:这将使用高达100%的CPU。

while(running) {
    long end = System.nanoTime() + micros * 1000;
    while (end > Systen.nanoTime()) { }
    // do something.
}
  

所以代码将在java中每隔......微秒运行

您可能需要考虑代码运行的时间

long delayNS = micros * 1000;
long next = System.nanoTime();
while(running) {
    next += delayNS;
    while (next > Systen.nanoTime()) { }
    // do something.
}

因此,如果代码需要一些时间,您仍然可以在事件之间获得一致的间距。

注意:

Thread.sleep(long millis, int nanos)然而它只是将nanos四舍五入到最近的毫秒。

LockSupport.parkNanos(n)可以是亚毫秒,但最小值通常约为25微秒(即使延迟时间为1 ns)

Thread.yield()可能需要16微秒,但也可能需要更长的时间。

答案 1 :(得分:0)

您可以在Thread对象中执行此操作,并在run方法中使用try catch行为。

    @Override
public void run()
{
    while (true) {
        try 
        {
            for (int cont = 0; cont < numberOfRequests; cont++) 
            {
                new GetRequestMethod(url, httpClient, defaultRequestConfig, logOption).start();
            }

            LOG.log(Level.INFO, "\n---------------Send REQUEST " + numberOfRequests + "---------------\n");

        }
        catch (OutOfMemoryError m) 
        {
            LOG.log(Level.SEVERE, "\n\n\n\n\n\n\n\n\n\nMemory Critical Error: " + m.getMessage() + "\n\n\n\n\n\n\n\n\n\n", m);
            sleep(TIME_SLEEP_EXCEPTION);
            renewManager();

        }
        catch (Throwable t) 
        {
            LOG.log(Level.SEVERE, "\n\n\n\n\n\n\n\n\n\nCritical Error!\n", t);
            sleep(TIME_SLEEP_EXCEPTION);
            renewManager();
        }
    }
}

睡眠方法:

private void sleep(int time)
{
    try 
    {
        Thread.sleep(time);
    }
    catch (InterruptedException e) 
    {
        LOG.log(Level.SEVERE, "\n\n\n\n\n\n\n\n\n\nSleeping Critical Error: " + e.getMessage() + "\n\n\n\n\n\n\n\n\n\n", e);
    }