{"id":868,"date":"2021-12-01T23:18:22","date_gmt":"2021-12-02T03:48:22","guid":{"rendered":"http:\/\/gregorgonzalez.com.ve\/blog\/?p=868"},"modified":"2021-12-01T23:19:48","modified_gmt":"2021-12-02T03:49:48","slug":"colocar-tiempo-limite-en-java","status":"publish","type":"post","link":"https:\/\/gregorgonzalez.com.ve\/blog\/colocar-tiempo-limite-en-java\/","title":{"rendered":"Colocar tiempo l\u00edmite en Java"},"content":{"rendered":"<p>En programaci\u00f3n algunos procesos y eventos se pueden ejecutar indefinidamente, por ejemplo con ciclos do-while, que no saldr\u00e1n del ciclo mientras no se cumpla una condici\u00f3n. Adicional podemos agregar una segunda condici\u00f3n de l\u00edmite de tiempo, de manera que podemos interrumpirlo para evitar errores o procesos que tardar\u00edan mucho sin un control.<\/p>\n<p>Ejemplo, podemos usar la clase Calendar para crear una instancia del tiempo y luego crear otra para verificar la diferencia entre dos tiempos:<\/p>\n<pre class=\"lang:java decode:true \">import java.util.Calendar;\r\npublic class MyClass {\r\n    public static void main(String args[]) {\r\n        \r\n        Calendar c2 = Calendar.getInstance(); \/\/ Tiempo actual con fecha y hora\r\n        System.out.println(c2.getTime());\r\n        c2.add(Calendar.SECOND, 5); \/\/ Al tiempo actual le sumamos 5 segundos\r\n        System.out.println(c2.getTime());\r\n        \r\n        try{\r\n            Thread.sleep(2000); \/\/ Con sleep detenemos la ejecuci\u00f3n y as\u00ed controlamos el tiempo transcurrido, 2000 = 2seg y no se pasa de los 5 segundos, 7000 = 7seg y se pasa de los 5 segundos\r\n        } catch (Exception ex) {\r\n            System.out.println(\"error\");\r\n        }\r\n        \r\n        Calendar c1 = Calendar.getInstance(); \/\/ Creamos un Nuevo tiempo actual\r\n        System.out.println(c1.getTime());\r\n        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.\r\n    }\r\n}<\/pre>\n<p>C1 indica el tiempo l\u00edmite. C2 solo es para comparar si pas\u00f3 ese l\u00edmite.<\/p>\n<p>La variable c1 contiene el tiempo actual +5seg (futuro que usamos como l\u00edmite), si colocamos un sleep de 2 segundos y luego comparamos con c2 que es el tiempo actual, indicar\u00eda -1 ya que no pas\u00f3 de 5 segundos.<\/p>\n<p>Si colocamos un sleep de 7 segundos y luego comparamos con c2 que es el tiempo actual, indicar\u00eda 1 ya que esta vez s\u00ed sobre pas\u00f3 los 5 segundos.<\/p>\n<p>Puedes probarlo r\u00e1pidamente utilizando un compilador online, solo copia y pega el ejercicio en <a href=\"https:\/\/www.jdoodle.com\/online-java-compiler\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.jdoodle.com\/online-java-compiler\/<\/a><\/p>\n<p>Esto fue un ejemplo general para probar el funcionamiento. Para aclararlo y que nos sea m\u00e1s \u00fatil, es mejor utilizarlo en alguna funci\u00f3n.<\/p>\n<p>&nbsp;<\/p>\n<h3>Ejemplo m\u00e1s ideal<\/h3>\n<pre class=\"lang:java decode:true \">import java.util.Calendar;\r\npublic class Tiempo {\r\n    \/\/ Devuelve el tiempo actual\r\n    public Calendar ahora(){ \r\n        return Calendar.getInstance();\r\n    }\r\n    \/\/ Establece un l\u00edmite dependiendo de los segundos y lo devuelve\r\n    public Calendar tiempoLimite(Calendar tiempo, int segundos){        \r\n        tiempo.add(Calendar.SECOND, segundos);\r\n        return tiempo;\r\n    }\r\n    \/\/ Usado para comparar si pas\u00f3 el limite\r\n    public boolean pasoLimite(Calendar tiempoLimite){ \r\n        boolean pasoLimite = false;\r\n        Calendar ahora = ahora();\r\n        \r\n        if(ahora.compareTo(tiempoLimite) == 1 ){\r\n            pasoLimite = true;\r\n        }\r\n        \r\n        return pasoLimite;\r\n    }\r\n}\r\n<\/pre>\n<h3><\/h3>\n<h3>Modo de uso<\/h3>\n<p>Digamos que estamos ejecutando alg\u00fan ciclo y queremos salir cuando pase el tiempo l\u00edmite.<\/p>\n<pre class=\"lang:java decode:true \">import java.util.Calendar;\r\nimport Tiempo;\r\npublic class MyClass {\r\n    public static void main(String args[]) {\r\n        Tiempo tiempo = new Tiempo();\r\n        boolean finalizar = false;\r\n\r\n        Calendar limite = tiempo.tiempoLimite(tiempo.ahora(), 30); \/\/ Limite de 30 segundos\r\n        do{\r\n           if(tiempo.pasoLimite(limite)){\r\n              System.out.println(\"Pas\u00f3 el l\u00edmite de 30 segundos\");\r\n              finalizar = true;\r\n           } else {\r\n              System.out.println(\"Estoy en el ciclo\");\r\n           }     \r\n        }while (!finalizar); \/\/ Mientras finalizar no sea igual a true\r\n     }\r\n}<\/pre>\n<p>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\u00edmite, se sale del ciclo. Esto es \u00fatil 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.<\/p>\n<p>Tambi\u00e9n se podr\u00eda establecer un l\u00edmite de intentos, con otra variable indicar por ejemplo un l\u00edmite de 3 y colocamos que, si al tercer intento no se ha logrado el proceso, se interrumpa para no realizarlo indefinidamente.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En programaci\u00f3n algunos procesos y eventos se pueden ejecutar indefinidamente, por ejemplo con ciclos do-while, que no saldr\u00e1n del ciclo mientras no se cumpla una condici\u00f3n. Adicional podemos agregar una segunda condici\u00f3n de l\u00edmite de tiempo, de manera que podemos interrumpirlo para evitar errores o procesos que tardar\u00edan mucho sin un control. Ejemplo, podemos usar [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":688,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[227],"tags":[326,325,324],"_links":{"self":[{"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/868"}],"collection":[{"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/comments?post=868"}],"version-history":[{"count":2,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/868\/revisions"}],"predecessor-version":[{"id":870,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/868\/revisions\/870"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media\/688"}],"wp:attachment":[{"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media?parent=868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/categories?post=868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/tags?post=868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}