524 votos

¿Cómo se hace un retraso en Java?

Estoy tratando de hacer algo en Java y necesito algo para esperar / retrasar una cantidad de segundos en un bucle while.

while (true) {
    if (i == 3) {
        i = 0;
    }

    ceva[i].setSelected(true);

    // I need to wait here

    ceva[i].setSelected(false);

    // I need to wait here

    i++;
}

Quiero construir un secuenciador por pasos y soy nuevo en Java. ¿Alguna sugerencia?

1023voto

Boris the Spider Puntos 20200

Si desea hacer una pausa, utilice java.util.concurrent.TimeUnit :

TimeUnit.SECONDS.sleep(1);

Dormir durante un segundo o

TimeUnit.MINUTES.sleep(1);

Para dormir un minuto.

Como se trata de un bucle, esto presenta un problema inherente: la deriva. Cada vez que ejecutas código y luego duermes estarás derivando un poco de ejecutar, digamos, cada segundo. Si esto es un problema, entonces no utilice sleep .

Además, sleep no es muy flexible en cuanto al control.

Para ejecutar una tarea cada segundo o con un retardo de un segundo, yo haría lo siguiente fuertemente recomendar un ScheduledExecutorService y scheduleAtFixedRate o scheduleWithFixedDelay .

Por ejemplo, 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");
}

Y en Java 7:

public static void main(String[] args) {
    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            myTask();
        }
    }, 0, 1, TimeUnit.SECONDS);
}

private static void myTask() {
    System.out.println("Running");
}

204voto

Anju Aravind Puntos 3054

Utilice Thread.sleep(1000) ;

1000 es el número de milisegundos que el programa hará una pausa.

try
{
    Thread.sleep(1000);
}
catch(InterruptedException ex)
{
    Thread.currentThread().interrupt();
}

30voto

Hecanet Puntos 401

Usa esto:

public static void wait(int ms)
{
    try
    {
        Thread.sleep(ms);
    }
    catch(InterruptedException ex)
    {
        Thread.currentThread().interrupt();
    }
}

y, a continuación, puede llamar a este método en cualquier lugar como:

wait(1000);

11voto

Ruslan Puntos 2446

Debe utilizar la función Thread.sleep() llamar.

Más información aquí: http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html

5voto

Michael Gantman Puntos 2102

Utilizando TimeUnit.SECONDS.sleep(1); o Thread.sleep(1000); Es una forma aceptable de hacerlo. En ambos casos hay que coger InterruptedException Hay una biblioteca java de código abierto llamada MgntUtils (escrita por mí) que proporciona utilidades que ya se ocupan de InterruptedException dentro. Así que su código sólo incluiría una línea:

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

Véase el javadoc aquí . Puede acceder a la biblioteca desde Maven Central o de Github . El artículo que explica la biblioteca puede encontrarse en aquí

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X