Java – alternativa a thread.sleep

Ho il requisito di mettere in pausa un ciclo while per un numero specifico di millisecondi. Ho provato a utilizzare Thread.sleep (durata) ma non è accurato, specialmente in uno scenario di looping. La precisione millisecondo è importante nel mio programma.

Ecco l’algoritmo in cui non voglio tornare indietro per verificare la presenza di una condizione fino a quando non è trascorso il tempo expectedElapsedTime da ElapsedTime.

 while (condition) { time = System.currentTimeMillis(); //do something if (elapsedTime(time) < expectedElapsedTime) ) { pause the loop // NEED SUBSTITUTE FOR Thread.sleep() } // Alternative that I have tried but not giving good results is while ((elapsedTime(time) < expectedElapsedTime)) { //do nothing } } long elapsedTime(long time) { long diff = System.currentTimeMillis() - time; return diff; } 

Prova un ScheduledThreadPoolExecutor . Dovrebbe dare risultati di cronometraggio più affidabili.

Cosa ti aspetti?

Se si va a dormire, una volta che il processo è nuovamente eseguibile, dovrà attendere che lo scheduler del thread lo pianifichi di nuovo.

Voglio dire che se vai a dormire per 50 secondi ciò non significa che il tuo processo verrà eseguito in esattamente 50 secondi. Perché dopo che si è svegliato ed è eseguibile, dovrà attendere per essere programmato per la CPU che richiede più tempo più il tempo che tu avere per interruttore di contesto.

Non c’è niente che puoi fare per controllarlo in modo da non poter avere la precisione che stai dicendo.

Per il tuo caso, suggerirei invece un anello rotante.

 long now = System.currentTimeMillis(); while(now < expectedElapsedTime){ now = System.currentTimeMillis(); } 

Java non è un sistema in tempo reale, non puoi far sparire un thread e tornare con un programma così serrato. Per pianificare l’esecuzione del programma fino al millisecondo, è necessario utilizzare una piattaforma diversa, ad esempio l’ estensione SimpleRTJ o Java Real-Time .

È probabile che il ritardo venga scelto in modo arbitrario, quindi metterei in dubbio la necessità di un intervallo di tempo reale.

Se hai bisogno di tempo di lettura, devi aspettare che arrivi il tempo necessario. Rinunciare alla CPU significa che non si può garantire che lo si possa recuperare esattamente quando lo si desidera.

È ansible implementare il meccanismo wait / notify e debind a un altro thread la responsabilità di notificare all’altro thread in stato di attesa che viene passato il tempo e che può andare avanti …

Ad esempio, quando il threadA deve attendere un certo periodo di tempo, è ansible mettere il thread in stato di attesa e avviare un’attività timer che, dopo un certo intervallo di tempo (intervallo), chiama notificare e ritriggersre il ThreadA che va avanti, questo potrebbe essere un’alternativa

Se vuoi essere preciso con i suoni, usa un sequencer e imposta il tempo in BPM: sequencer.setTempoInBPM (120);

Non dimenticare le pause dei raccoglitori. Può battere tutti i tuoi piani

La soluzione è usare un gestore con un eseguibile e utilizzare il metodo ‘postDelayed’. Esempio:

 new Handler().postDelayed(new Runnable() { public void run () { // Do delayed stuff! } }, 5000L); //5 seconds delay 

https://stackoverflow.com/a/21680858