En programación algunos procesos y eventos se pueden ejecutar indefinidamente, por ejemplo con ciclos do-while, que no saldrán del ciclo mientras no se cumpla una condición. Adicional podemos agregar una segunda condición de límite de tiempo, de manera que podemos interrumpirlo para evitar errores o procesos que tardarían mucho sin un control.
Ejemplo, podemos usar la clase Calendar para crear una instancia del tiempo y luego crear otra para verificar la diferencia entre dos tiempos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.Calendar; public class MyClass { public static void main(String args[]) { Calendar c2 = Calendar.getInstance(); // Tiempo actual con fecha y hora System.out.println(c2.getTime()); c2.add(Calendar.SECOND, 5); // Al tiempo actual le sumamos 5 segundos System.out.println(c2.getTime()); try{ Thread.sleep(2000); // Con sleep detenemos la ejecución y así controlamos el tiempo transcurrido, 2000 = 2seg y no se pasa de los 5 segundos, 7000 = 7seg y se pasa de los 5 segundos } catch (Exception ex) { System.out.println("error"); } Calendar c1 = Calendar.getInstance(); // Creamos un Nuevo tiempo actual System.out.println(c1.getTime()); System.out.println(c1.compareTo(c2)); // Comparamos con el tiempo transcurrido anterior, indica -1 si es menor, 1 si es mayor y 0 si son iguales. } } |
C1 indica el tiempo límite. C2 solo es para comparar si pasó ese límite.
La variable c1 contiene el tiempo actual +5seg (futuro que usamos como límite), si colocamos un sleep de 2 segundos y luego comparamos con c2 que es el tiempo actual, indicaría -1 ya que no pasó de 5 segundos.
Si colocamos un sleep de 7 segundos y luego comparamos con c2 que es el tiempo actual, indicaría 1 ya que esta vez sí sobre pasó los 5 segundos.
Puedes probarlo rápidamente utilizando un compilador online, solo copia y pega el ejercicio en https://www.jdoodle.com/online-java-compiler/
Esto fue un ejemplo general para probar el funcionamiento. Para aclararlo y que nos sea más útil, es mejor utilizarlo en alguna función.
Ejemplo más ideal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.util.Calendar; public class Tiempo { // Devuelve el tiempo actual public Calendar ahora(){ return Calendar.getInstance(); } // Establece un límite dependiendo de los segundos y lo devuelve public Calendar tiempoLimite(Calendar tiempo, int segundos){ tiempo.add(Calendar.SECOND, segundos); return tiempo; } // Usado para comparar si pasó el limite public boolean pasoLimite(Calendar tiempoLimite){ boolean pasoLimite = false; Calendar ahora = ahora(); if(ahora.compareTo(tiempoLimite) == 1 ){ pasoLimite = true; } return pasoLimite; } } |
Modo de uso
Digamos que estamos ejecutando algún ciclo y queremos salir cuando pase el tiempo límite.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.util.Calendar; import Tiempo; public class MyClass { public static void main(String args[]) { Tiempo tiempo = new Tiempo(); boolean finalizar = false; Calendar limite = tiempo.tiempoLimite(tiempo.ahora(), 30); // Limite de 30 segundos do{ if(tiempo.pasoLimite(limite)){ System.out.println("Pasó el límite de 30 segundos"); finalizar = true; } else { System.out.println("Estoy en el ciclo"); } }while (!finalizar); // Mientras finalizar no sea igual a true } } |
Esto es una idea general, nosotros establecemos cuando salir del ciclo normalmente con una variable que controlamos finalizar = true, pero adicional establecemos un timeout para las operaciones, si se pasa del tiempo límite, se sale del ciclo. Esto es útil para ciertos eventos, si tenemos consultas que no deben tardar tanto, conexiones que debemos interrumpir si se exceden o si queremos que se repitan cada cierto tiempo.
También se podría establecer un límite de intentos, con otra variable indicar por ejemplo un límite de 3 y colocamos que, si al tercer intento no se ha logrado el proceso, se interrumpa para no realizarlo indefinidamente.