我想将一个while循环与Thread.sleep结合起来,因此代码将在java中每隔纳秒或微秒运行一次。有人能帮我吗?抱歉我的英语不好,我是荷兰人。
答案 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);
}