2015-09-30 3 views
8

Dato un orologio, un istantaneo e il thread corrente, c'è già qualche metodo (di utilità) nelle librerie Java che fa in modo che il thread corrente si interrompa fino a quando l'orologio specificato raggiunge l'istante?Esiste un metodo in Java 8 per fare in modo che un thread dorme fino a un istante utilizzando un orologio specifico?

Qualcosa di simile

public static void sleepUntil(Instant instant, Clock clock) 
throws InterruptedException; 

?

Ho bisogno di questo in un'impostazione di prova in cui sto lavorando con un orologio personalizzato rallentato.

So che è facile da implementare, ma preferirei una soluzione standard se disponibile (ma non l'ho trovata finora).

+1

In realtà, forse non così facile da implementare ... – Gustave

+0

Forse potresti in qualche modo convertire in ['TimeUnit'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html) e chiamarlo' sleep'? –

+0

No, perché non sembra esserci alcuna possibilità di rendere TimeUnit consapevole dell'orologio personalizzato. – Gustave

risposta

0

L'unico modo che posso vedere è quello di creare un ciclo while e interromperlo quando l'orologio ha raggiunto l'istante dato.

public static void sleepUntil(Instant instant, Clock clock) throws InterruptedException { 
    while (clock.millis() < instant.toEpochMilli()) { 
     Thread.sleep(1000); 
    } 
} 

Per l'orologio fisso, tuttavia, questo si interrompe per sempre.

+0

Non funziona, perché Thread.sleep (long millis) utilizza l'orologio di sistema e non l'orologio personalizzato. – Gustave

+0

@Gustave OK, ho letto male la tua domanda. Vedi la mia modifica. – Tunaki

1

Prima di tutto, Clock è davvero semplice classe con poco implementation e few uses in the standard API. SystemClock, OffsetClock e TickClock sono esempi nello stesso file. Quindi la risposta sembra essere No, non è nello default API.

Se le viene somministrato il "orologio rallentato-down" e non puoi modificarlo in modo da aggiungere il desiderato sleepUntil() -Codice, ed è rallentato da un importo fisso, si potrebbe fare qualcosa di simile

public static void sleepUntil(Instant instant, Clock clock) 
    throws InterruptedException { 

    Instant now = Instant.now(clock); 
    long duration = now.until(instant, ChronoUnit.MILLIS); 
    long testSleep 
     = (duration < 10000)? (duration/10) : 1000; 
    long start = clock.millis(); 
    Thread.sleep(testSleep); 
    long stop = clock.millis(); 
    double clockskew = (stop - start)/testSleep; 

    now = Instant.now(clock); 
    Thread.sleep(now.until(instant, ChronoUnit.MILLIS) * clockskew); 
} 

Questo primo esegue un test per determinare l'inclinazione dell'orologio, quindi dorme una durata regolata.

(Forse è necessario regolare l'istante in sleep per regolare l'altro orologio. Pubblica il tuo codice di orologio se si desidera avere testato/regolato.)

Problemi correlati