second pause code java sleep

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.



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