Nanosekunden-Pause innerhalb einen Thread-Loops

mariane

Mitglied
Hallo,

ich suche eine Möglichkeit innerhalb einer While-Schleife, die Bestandteil eines Threads ist, ohne größere CPU-Last eine Pause im Nanosekundenbereich einzubauen. Angedacht sind mittels einem weiteren while-loop und System.nanoTime() experimentell ermittelte 20000ns.

Benutze ich nun stattdessen Thread.sleep(0,20000) gehts in die Hose, sleep() löst leider nicht besser als 1ms auf, entspricht also Thread.sleep(1), kürzer ist nicht möglich, außer natürlich sleep(0).
Die sleep-Variante hat eh weitere Nachteile, so das nicht zugesichertes Warte-Interval und dass die Ausführungszeit der Instruktionen innerhalb des Loops im Thread nicht eingehen können.

Gibt es noch andere Möglichkeiten?

Die Variante A funktioniert, erzeugt aber CPU-Last vom Feinsten.
Variante B funktioniert nicht, was das gewünschte Zeitinvervall angeht.

Beste Grüße, mariane
Java:
// A
@Override
public void run()
{
    long pause = 20000;
    long start;
   
    ...
   
    while(true)
    {
        start = System.nanoTime();
       
        ...
       
        if(Thread.interrupted())
        {
            break;
        }
        while(start + pause > System.nanoTime())
        {
        }
    }
}
Java:
// B
@Override
public void run()
{
    int pause = 20000;
   
    ...
   
    while(true)
    {
        ...
       
        try
        {
            Thread.sleep(0, pause);
        }
        catch( InterruptedException e )
        {
            break;
        }
    }
}
 
Ich glaube nicht, dass das funktioniert. Entweder das Programm prüft wie in Variante A selbst, ob es soweit ist. Dann benötigt es dafür auch Rechenzeit.
Oder der Prozess, in dem das Programm läuft, legt sich kurz schlafen. Dann verbraucht er keine Rechenzeit, muß aber wieder aktiviert werden. Dafür wird wohl ein Scheduler des Betriebssystems zuständig sein. Für den wären sehr kurze Umschaltzeiten aber vermutlich nicht sinnvoll, weil zuviel Overhead für häufige Prozesswechsel anfallen würde.
Die Erklärung ist ein wenig spekulativ, aber ich kann es mir im Moment nur so vorstellen.
 
Also ich glaube nicht, dass du nano sekunden genau mit Java programmieren kannst. Überhaupt wird das auf einem Multitasking OS schwer werden. Solche genauigkeiten erhälst du nur wenn du mit Hardware Interrupts (z.B. vomTimer Chip) arbeitest und das geht nicht in Java
 

Zurück
Oben