2017-08-04 8 views
-1

Ich möchte eine while-Schleife mit Thread.sleep kombinieren, so dass der Code in jeder Nanosekunde oder Mikrosekunde in Java ausgeführt wird. Kann mir jemand helfen? Sorry für mein schlechtes Englisch, ich bin Holländer.Wie kombiniere ich Thread.sleep und While-Schleife in Java?

+1

haben Sie alles versucht? Zeigen Sie uns einen Code, den Sie geschrieben haben, um dies zu versuchen. Dies ist kein kostenloser Codierservice – ja08prat

+1

Was genau ist die Schwierigkeit, die Sie haben? Sie können tatsächlich 'Thread.sleep()' innerhalb einer 'while' Schleife aufrufen; Wenn Sie etwas versucht haben, das nicht funktioniert hat, dann präsentieren Sie den Code. Ansonsten versuchen Sie es sich selbst auszuarbeiten, bevor Sie hier eine Frage stellen. –

+0

Ich habe folgendes versucht: 'while (etwas) {Thread.sleep (0,1000); // Ich habe etwas gemacht, natürlich mit Versuch und Fang}' aber das Programm friert jedes Mal ein, wenn ich das benutze und ich muss das Fenster schließen Taskmanager. –

Antwort

3

Sie können nicht für eine Mikrosekunde schlafen und nur die Überprüfung der Zeit dauert viele Nano-Sekunden.

Wenn Sie auf eine Mikrosekunde warten möchten, müssen Sie warten. Hinweis: Dies wird bis zu 100% CPU verbrauchen.

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

so wird der Code jedes ... Mikrosekunde in Java

Sie könnten berücksichtigen wollen, wie lange der Code für läuft

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

Also, wenn die Der Code braucht einige Zeit, bis Sie einen konsistenten Abstand zwischen den Ereignissen erhalten.

Hinweis:

Es gibt Thread.sleep(long millis, int nanos) aber es rundet nur die nanos auf die nächsten Millis.

Es ist LockSupport.parkNanos(n) die Unter Millis sein kann, aber ist typischerweise ein Minimum von etwa 25 Mikrosekunden (sogar für eine 1 ns Verzögerung)

Es ist Thread.yield(), die 16 Mikrosekunden dauern können, aber es kann auch viel länger.

+0

Was meinst du mit Laufen? Und ist es richtig, dass Mikro den Wert 1 hat? –

+0

@ DaniëlvanderZwan Sie können ein Flag verwenden, um zu bestimmen, wie lange die Schleife ausgeführt werden soll. Wenn Sie ein Intervall von 1 Mikrosekunden benötigen, können Sie 'micros = 1' –

+1

erwähnen, in der Antwort, dass dies Auswirkungen auf die CPU-Zyklen hat, da der Code ständig die ganze Zeit tut, er ist nicht im Leerlauf (es ist das Gegenstück zur Sicherstellung genau Timing zwischen den Executionen) –

0

Sie können dies in einem Thread-Objekt tun und in der run-Methode setzen Sie Ihre while mit try Catch-Verhalten.

@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(); 
     } 
    } 
} 

Schlaf-Methode:

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); 
    }