Autor Tema: error: unreported exception InterruptedException; must be caught or declared to  (Leído 3538 veces)

CoduJ

  • Sin experiencia
  • *
  • Mensajes: 28
    • Ver Perfil
Buenas. Estoy utilizando el Thread.sleep() para parar la consola en una fracción de tiempo marcada en milisegundos. Tengo una duda, al escribir a secas "Thread.sleep(X)" me sale el siguiente error:

Código: [Seleccionar]
error: unreported exception InterruptedException; must be caught or declared to be thrown

Sé que al lado de la clase main hay que colocar lo siguiente:

Código: [Seleccionar]
public static void main(String[] args) throws InterruptedException

Pero, ¿por qué debe estar eso ahí?; investigue acerca de "throws", (resulta que existe "throw" y "throws"), y según lo que entendí, es algo para poder manejar errores en Java durante la ejecución de un programa, pero no logró relacionar estos conceptos, ¿qué está pasando?
« Última modificación: 29 de Octubre 2020, 18:04 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:Thread.sleep() en Java
« Respuesta #1 en: 20 de Julio 2020, 12:55 »
Detener un hilo de ejecución con sleep() puede producir una excepción cuando se trabaja con varios hilos que interactúan entre ellos.

Este no va a ser el caso de tu programa seguramente, pero Java exige controlar esa posible excepción.

Seguramente te va a ser más que suficiente que uses try catch en la parte del código donde quieres hacer un sleep().

Por ejemplo:

Código: [Seleccionar]
public class SleepConsola {

public static void main(String[] args) {

try {
System.out.println("Siguiente mensaje en 1 segundo");
Thread.sleep(1000);
System.out.println("Siguiente mensaje en 2 segundos");
Thread.sleep(2000);
System.out.println("Siguiente mensaje en 3 segundos");
Thread.sleep(3000);
System.out.println("Mensaje Final");
} catch (InterruptedException e) {
e.printStackTrace();
}

}

}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

CoduJ

  • Sin experiencia
  • *
  • Mensajes: 28
    • Ver Perfil
Re:Thread.sleep() en Java
« Respuesta #2 en: 21 de Julio 2020, 22:47 »
Mmm... Creo que logro entender, ¿pero a qué te refieres exactamente con "hilos"?
« Última modificación: 29 de Octubre 2020, 18:03 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:Thread.sleep() en Java
« Respuesta #3 en: 22 de Julio 2020, 01:32 »
Cuando ejecutas un programa, se inicia un hilo (thread), es decir, una secuencia de tareas que se procesan en orden, desde la primera hasta la última, hasta terminar y por tanto el hilo/proceso se cierra.
Esas tareas dependen de las instrucciones del programa y la siguiente tarea solo comienza cuando ha finalizado la tarea anterior

Por ejemplo, en el código que yo puse, se ejecutan cuatro tareas, que son mostrar los cuatro mensajes en pantalla.
Como hemos visto en ese mismo ejemplo, el hilo/proceso que se inicia para llevar a cabo estas tareas podemos mandarlo "dormir" con Thread.sleep() durante un tiempo determinado.

Bueno, la mayoría de programas que hacemos suelen ser "monohilo", o sea, un único hilo/proceso para realizar las tareas.

Pero para programas más avanzados vamos a preferir, incluso necesitar, hacer un programa "multihilo", es decir, abrir varios hilos de ejecución para repartir tareas y no sobrecargar el hilo principal.

Imagina por ejemplo, no se, que haces un programa en el que el usuario pueda juntar y editar vídeos y subir su composición a un servidor de Internet, tipo youtube, para que otros lo vean.
Si nuestro programa fuese monohilo, cuando el usuario ordena subir el vídeo al servidor, el programa quedaría paralizado hasta que el vídeo terminase de transferirse por completo.
Como dije antes, en un hilo la tarea siguiente no se ejecuta hasta que finaliza la tarea anterior.
Y si esta tarea anterior consiste en subir un vídeo, lo cuál puede llevar varios minutos, significa parar la "productividad" del programa hasta que este proceso termine.

Pero, si nuestro programa fuese multihilo, podríamos hacer que el proceso de subir el vídeo se encargase un hilo distinto al del programa principal. Así el vídeo se va subiendo en segundo plano y mientras tanto el usuario puede empezar a trabajar en su siguiente vídeo.
Incluso puede poner varios vídeos a subir al mismo tiempo.

Te he puesto un ejemplo muy concreto, pero tiene multitud de usos. Siempre que necesitemos realizar una tarea que sabemos que puede demorar cierto tiempo, aunque sea unos cuantos segundos, vamos a preferir hacerlo en un hilo separado para que la aplicación principal no se quede bloqueada esperando a que termine esa otra tarea más pesada.

En Java es muy fácil crear hilos. La habitual es usar la clase Thread.
Aquí pongo un pequeño ejemplo donde escribo una clase que hereda de Thread mediante la cuál poder crear hilos.
Estos hilos van a hacer una tarea estúpida, incrementar 3 bucles for anidados entre sí.
Es una tarea estúpida, pero pesada, de hecho en ordenadores poco potentes puede tardar un poquito en completarse esos bucles for.

En el ejemplo lo que hago es crear e iniciar 5 hilos paralelos realizando esta tarea.
Lanzan un mensaje cuando empieza y otro cuando terminan.
Esto sirve para ver algo importante sobre los hilos, cada uno va a su ritmo, según el sistema operativo les va dando/quitando recursos.
Esto implica que el primer hilo en activarse, luego puede que sea el último en terminar.

A continuación pondré el código para que lo pruebes y te hagas una idea.
De todos modos, ahora mismo te diría que no inviertas tiempo ni esfuerzo en esto de crear hilos.
No es algo que vayas a necesitar ahora y mejor invertir tiempo en aprender otras cosas de Java más necesarias e importantes.
Por ahora basta con que sepas que esto existe. Eso sí, pregunta lo que quieras.
Un saludo.

Código: [Seleccionar]
public class MultiHilo {

//Clase que hereda de Thread para crear un hilo de ejecución
private static class Hilo extends Thread {

private String nombreHilo;

public Hilo(String nombre) {
nombreHilo = nombre;
}

@Override
public void run() {
System.out.println("Iniciado el hilo " + nombreHilo);
for (int i = 0; i < 100000; i++) {
for (int j = 0; j < 100000; j++)
for (int z = 0; z < 100000; z++);
}
System.out.println("Finalizado el hilo " + nombreHilo);
}
}

//Método main para probar los hilos
public static void main(String[] args) {

Hilo hilo1 = new Hilo("Hilo 1");
Hilo hilo2 = new Hilo("Hilo 2");
Hilo hilo3 = new Hilo("Hilo 3");
Hilo hilo4 = new Hilo("Hilo 4");
Hilo hilo5 = new Hilo("Hilo 5");
//Iniciamos los hilos
hilo1.start();
hilo2.start();
hilo3.start();
hilo4.start();
hilo5.start();

}

}

NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".