2017-08-04 64 views
-1

我想結合一個while循環與Thread.sleep,所以代碼將運行在Java中每納秒或微秒。有人能幫我嗎?對不起,我的英文不好,我是荷蘭人。我如何結合Java中的Thread.sleep和while循環?

+1

你嘗試過什麼嗎?向我們展示您編寫的一些代碼以嘗試此操作。這不是一個免費的編碼服務 – ja08prat

+1

你到底有什麼困難?你確實可以在'while'循環內調用'Thread.sleep()';如果你嘗試了一些不起作用的東西,那就提交代碼。否則,在這裏提出問題之前,儘量自己解決。 –

+0

我試過這個:'while(something){Thread.sleep(0,1000); //我做了一些事情,當然還有try和catch}'但是程序每次使用都會凍結,我必須關閉Window任務管理器。 –

回答

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納秒延遲)

Thread.yield()可以採取16微秒的,但它也可以採取時間更長。

+0

你在跑步時意味着什麼? micro的值是1是不是正確? –

+0

@DaniëlvanderZwan你可以使用一個標誌來確定你想要循環運行多長時間。如果你想要1微秒的時間間隔,你可以在答案中使用'micros = 1' –

+1

,這會影響CPU週期,因爲代碼實際上一直在做東西,它不是空閒的(這是確保確切的執行程序之間的時間) –

0

您可以在Thread對象內執行此操作,並在run方法中將您的while與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); 
    }