java - pause - Obtengo una excepción cuando uso Thread.sleep(x) o wait()
pause en java (13)
He intentado retrasar, o poner en suspensión, mi programa Java, pero se produce un error.
No puedo usar Thread.sleep(x)
o wait()
. Aparece el mismo mensaje de error:
excepción no reportada java.lang.InterruptedException; Debe ser atrapado o declarado para ser arrojado.
¿Se requiere algún paso antes de usar los Thread.sleep()
o wait()
?
Al usar Android (el único momento en que uso Java) recomendaría usar un controlador en lugar de poner el hilo en suspensión.
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.i(TAG, "I''ve waited for two hole seconds to show this!");
}
}, 2000);
Referencia: http://developer.android.com/reference/android/os/Handler.html
Alternativamente, si no quieres tratar con hilos, prueba este método:
public static void pause(int seconds){
Date start = new Date();
Date end = new Date();
while(end.getTime() - start.getTime() < seconds * 1000){
end = new Date();
}
}
Comienza cuando lo llamas y termina cuando han pasado la cantidad de segundos.
Como han dicho otros usuarios, debe rodear su llamada con un bloque try{...} catch{...}
. Pero desde que se lanzó Java 1.5, existe la clase TimeUnit que hace lo mismo que Thread.sleep (millis) pero es más conveniente. Usted puede elegir la unidad de tiempo para la operación de sueño.
try {
TimeUnit.NANOSECONDS.sleep(100);
TimeUnit.MICROSECONDS.sleep(100);
TimeUnit.MILLISECONDS.sleep(100);
TimeUnit.SECONDS.sleep(100);
TimeUnit.MINUTES.sleep(100);
TimeUnit.HOURS.sleep(100);
TimeUnit.DAYS.sleep(100);
} catch (InterruptedException e) {
//Handle exception
}
También tiene métodos adicionales: TimeUnit Oracle Documentation.
Eche un vistazo a esta excelente publicación breve sobre cómo hacerlo correctamente.
Esencialmente: atrapar la InterruptedException
. Recuerda que debes agregar este catch-block. El post explica esto un poco más.
Mis formas de agregar retraso a un programa Java.
public void pause1(long sleeptime) {
try {
Thread.sleep(sleeptime);
} catch (InterruptedException ex) {
//ToCatchOrNot
}
}
public void pause2(long sleeptime) {
Object obj = new Object();
if (sleeptime > 0) {
synchronized (obj) {
try {
obj.wait(sleeptime);
} catch (InterruptedException ex) {
//ToCatchOrNot
}
}
}
}
public void pause3(long sleeptime) {
expectedtime = System.currentTimeMillis() + sleeptime;
while (System.currentTimeMillis() < expectedtime) {
//Empty Loop
}
}
Esto es para el retraso secuencial, pero para los retrasos de bucle se refieren a Java Delay / Wait .
Ponga su Thread.sleep
en un bloque try catch
try {
//thread to sleep for the specified number of milliseconds
Thread.sleep(100);
} catch ( java.lang.InterruptedException ie) {
System.out.println(ie);
}
Prueba esto:
try{
Thread.sleep(100);
}catch(Exception e)
{
System.out.println("Exception caught");
}
Tienes mucha lectura por delante. Desde errores del compilador a través del manejo de excepciones, subprocesos e interrupciones de subprocesos Pero esto hará lo que quieras:
try {
Thread.sleep(1000); //1000 milliseconds is one second.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
Una forma más sencilla de esperar es usar System.currentTimeMillis()
, que devuelve el número de milisegundos desde la medianoche del 1 de enero de 1970 UTC. Por ejemplo, para esperar 5 segundos:
public static void main(String[] args) {
//some code
long original = System.currentTimeMillis();
while (true) {
if (System.currentTimeMillis - original >= 5000) {
break;
}
}
//more code after waiting
}
De esta manera, no tienes que andar con hilos y excepciones. ¡Espero que esto ayude!
Use la siguiente construcción de codificación para manejar las excepciones
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
//Handle exception
}
Utilice java.util.concurrent.TimeUnit
:
TimeUnit.SECONDS.sleep(1);
Dormir por un segundo o
TimeUnit.MINUTES.sleep(1);
Duerme un minuto.
Como esto es un bucle, esto presenta un problema inherente: la deriva. Cada vez que ejecute el código y luego duerma, se desviará un poco de la ejecución, digamos, cada segundo. Si esto es un problema, entonces no use el sleep
.
Además, el sleep
no es muy flexible cuando se trata de controlar.
Para ejecutar una tarea cada segundo o con un retraso de un segundo, recomendaría encarecidamente un [ ScheduledExecutorService
] [1] y cualquiera [ scheduleAtFixedRate
] [2] o [ scheduleWithFixedDelay
] [3].
Para ejecutar el método myTask
cada segundo (Java 8):
public static void main(String[] args) {
final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(App::myTask, 0, 1, TimeUnit.SECONDS);
}
private static void myTask() {
System.out.println("Running");
}
Thread.sleep()
es simple para los principiantes y puede ser apropiado para pruebas de unidad y pruebas de concepto.
Pero, por favor, NO use sleep()
para el código de producción. Eventualmente el sleep()
puede morderte mal.
Práctica recomendada para las aplicaciones java multihilo / multinúcleo para utilizar el concepto de "espera de hilo". Wait libera todos los bloqueos y monitores que mantiene el hilo, lo que permite que otros subprocesos adquieran esos monitores y continúen mientras su hilo está durmiendo tranquilamente.
El código de abajo demuestra esa técnica:
import java.util.concurrent.TimeUnit;
public class DelaySample {
public static void main(String[] args) {
DelayUtil d = new DelayUtil();
System.out.println("started:"+ new Date());
d.delay(500);
System.out.println("half second after:"+ new Date());
d.delay(1, TimeUnit.MINUTES);
System.out.println("1 minute after:"+ new Date());
}
}
Implementación DelayUtil
:
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class DelayUtil {
/**
* Delays the current thread execution.
* The thread loses ownership of any monitors.
* Quits immediately if the thread is interrupted
*
* @param durationInMillis the time duration in milliseconds
*/
public void delay(final long durationInMillis) {
delay(durationInMillis, TimeUnit.MILLISECONDS);
}
/**
* @param duration the time duration in the given {@code sourceUnit}
* @param unit
*/
public void delay(final long duration, final TimeUnit unit) {
long currentTime = System.currentTimeMillis();
long deadline = currentTime+unit.toMillis(duration);
ReentrantLock lock = new ReentrantLock();
Condition waitCondition = lock.newCondition();
while ((deadline-currentTime)>0) {
try {
lock.lockInterruptibly();
waitCondition.await(deadline-currentTime, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
} finally {
lock.unlock();
}
currentTime = System.currentTimeMillis();
}
}
}
public static void main(String[] args) throws InterruptedException {
//type code
short z=1000;
Thread.sleep(z);/*will provide 1 second delay. alter data type of z or value of z for longer delays required */
//type code
}
p.ej:-
class TypeCasting {
public static void main(String[] args) throws InterruptedException {
short f = 1;
int a = 123687889;
short b = 2;
long c = 4567;
long d=45;
short z=1000;
System.out.println("Value of a,b and c are/n" + a + "/n" + b + "/n" + c + "respectively");
c = a;
b = (short) c;
System.out.println("Typecasting...........");
Thread.sleep(z);
System.out.println("Value of B after Typecasting" + b);
System.out.println("Value of A is" + a);
}
}