Archivo

Artículos etiquetados y‘Java’

Hilos o Threads (Ejemplo en Java)

Ahora les voy a explicar un poco sobre este interesante tema.
Antes, una aplicación se ejecutaba secuencialmente, es decir, paso a paso o línea a línea, con el pasar del tiempo se requirió la ejecución de instrucciones en paralelo dentro de un mismo programa o proceso, esto condujo a que los lenguajes nos ofrecieran soporte para este tipo de programación naciendo así la programación multi-hilo o multi-threading.
¿Que es un proceso?
Sin ahondar en esto, un proceso es un conjunto formado por las instrucciones del programa, su propio estado de ejecución, el espacio de memoria que utiliza mientras se ejecuta y alguna información mas que necesite el S.O. para ejecutarlo.
Para el caso de un programa multi-hilo además se almacena la información de cada hilo, cabe destacar que cada hilo tiene su propio estado.
Ahora, ¿Que es un hilo (thread)?
Un hilo es un conjunto de instrucciones que se ejecutan dentro del programa, lo diferente, un programa puede tener múltiples hilos y ejecutarlos en paralelo.

Los hilos se pueden ejecutar de forma sincronizada o no sincronizada, no es complejo pero lo explicare con un ejemplo
Se lanzan 3 hilos, estos 3 hilos llaman al mismo método.
De forma no sincronizada el método se ejecuta 3 veces de forma paralela
De forma sincronizada el método se ejecutara 3 veces de forma procedural, es decir, primero un hilo, luego el siguiente y finalmente el ultimo.

Orden de ejecución
Uff, raro, mejor dicho aleatorio, el orden lo maneja el S.O., si lanzo 5 hilos y ejecuto el programa 10 veces lo más probable es que las 10 veces el orden de ejecución de los hilos sea distinto.
Para solucionar esto están las prioridades, este punto lo tocare en otra entrada ya que no lo he utilizado mucho.

Ahora un ejemplo de programación multi-hilo en Java (En la actualidad la mayoría de los lenguajes soporta este tipo de programación)

principal.java

import java.io.*;

//Clase Principal
class principal{
    public static void main(String[] args){
			Menu();
        }
	public static void Menu(){
			System.out.println("Menu");
			System.out.println("----\n");
			System.out.println("1. Ejemplo No Sincronizado");
			System.out.println("2. Ejemplo Sincronizado");
			System.out.println("3. Cerrar");

			String str = new String();
			BufferedReader entrada = new BufferedReader (new InputStreamReader(System.in));
			try{
				str = entrada.readLine();
			}catch(IOException ex){}

			switch(Integer.valueOf(str)) {
			case 1:
				//No Sincronizado
				Hilo h1 = new Hilo("Hilo 1",false);
				Hilo h2 = new Hilo("Hilo 2",false);
				h1.start();
				h2.start();
				break;
			case 2:
				//Sincronizado
				Hilo h3 = new Hilo("Hilo 3",true);
				Hilo h4 = new Hilo("Hilo 4",true);
				h3.start();
				h4.start();
				break;
			case 3:
				System.exit(0);
				break;
			default:
				Menu();
				break;
			}

		}
}

//Clase que extiende de Thread (Hilo)
class Hilo extends Thread{
    String Nombre = new String();
	Boolean Sincronizar;
    public Hilo(String str, Boolean Sinc) {
        super(str);
        Nombre = str;
	this.Sincronizar = Sinc;
    }

    public void run() {
		if(Sincronizar)
			Proceso.Sincronizado(Nombre);
		else
			Proceso.NoSincronizado(Nombre);
    }
}

//Clase que contiene el proceso que ejecutaran los hilos
class Proceso{
    static void NoSincronizado(String str) {
        for (int i = 0; i <= 9999; i++) {
            System.out.println("En " + str);
        }
    }

    static synchronized void Sincronizado(String str) {
        for (int i = 0; i <= 9999; i++) {
            System.out.println("En " + str);
        }
    }
}

Explicando un poco el código, explicare solo las partes fundamentales, asumo lectores con experiencia en el lenguaje:
Lo primero es ejecutar el método menu() donde se presentan las opciones para ejecutar hilos de forma sincronizada o no sincronizada.
En las líneas 24 y 25 se crean objetos a partir de la clase Hilo, la clase Hilo se extiende de Thread (nombre de clases y variables bastante descriptivos), el constructor de esta clase recibe el nombre del hilo a crear (Línea 52), la variable boolean que le sigue es para especificar si este objeto se va a ejecutar sincronizado o no.
El método start() sirve para lanzar el hilo, no confundir con el método run(), que ejecuta el método run() especificado por la interface de la clase thread, ESTO NO LANZA EL HILO COMO PROCESO APARTE, EJECUTA EL METODO EN LA MISMA LINEA DEL PROGRAMA, O SEA PROCEDURAL.

Para definir un método como sincronizado, basta con anteponer la sentencia synchronized y automáticamente este se sincronizara dependiendo de las solicitudes que este tenga.

Espero les haya sido de ayuda
Saludos

Categorías:Java Etiquetas: , , ,

Monitorear la JVM

Hace un rato estaba programando threads (Hilos) en java y me dieron ganas de verlos, más que nada para realmente darme cuenta de que eran procesos aparte (Aunque basta con ver la ejecución del programa, pero uno siempre quiere mas).
De esa forma di con VisualVM, una excelente aplicación para monitorear las aplicaciones que hacen uso de la JVM, el punto en contra, al parecer no tiene versión para Linux =( .
Sin más, les dejo unos screenshot y la pagina del autor para que lo evalúen.

Página del autor
–> DESCARGA <–

Categorías:Java, Programación, Software Etiquetas: , , ,
Seguir

Get every new post delivered to your Inbox.