Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: CoduJ en 20 de Julio 2020, 04:33

Título: error: unreported exception InterruptedException; must be caught or declared to
Publicado por: CoduJ en 20 de Julio 2020, 04:33
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?
Título: Re:Thread.sleep() en Java
Publicado por: Kabuto 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();
}

}

}
Título: Re:Thread.sleep() en Java
Publicado por: CoduJ en 21 de Julio 2020, 22:47
Mmm... Creo que logro entender, ¿pero a qué te refieres exactamente con "hilos"?
Título: Re:Thread.sleep() en Java
Publicado por: Kabuto 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();

}

}