Está en la página 1de 7

1. INTRODUCCIÓN

Practica # 4

Procesos en Java

Java dispone de un mecanismo de hilos de proceso que permite crear este tipo de aplicaciones de una forma considerablemente fácil. Gran parte de los estándares de la plataforma Java emplean hilos de proceso de manera implícita, es decir, sin que el programador tenga que ser consciente de ello. Muchas de las estructuras de datos proporcionadas por la API estándar de Java están preparadas para afrontar las operaciones de lectura y escritura simultánea. En estos casos Java realiza la mayor parte del trabajo que implican los hilos de proceso, y por ello no es preciso que el programador entienda todas y cada una de dichas tareas que subyacen. Sin embargo, aunque no sea necesario sí que es conveniente, ya que ello constituye el paso previo para que el programador sea después capaz de implementar mecanismos equivalentes en sus propias aplicaciones.

2. CONCEPTOS

Un proceso es una instancia de un programa que se está ejecutando. Un explorador y un editor de texto ejecutándose en la computadorapueden estar ejecutando uno o más procesos de tal manera que se estén realizando varias tareas.

Un proceso puede definirse como un programa y toda la información que necesita para ejecutarse, lo que incluye aspectos tales como la memoria, los registros, etc.

Un programa es un trozo de código “sin vida” mientras que un proceso es un programa en ejecución, lo que abarca algo mucho más amplio. El sistema operativo debe tener los datos suficientes de cada proceso para poder ejecutarlo o para detener su ejecución en cualquier momento. A esta información se le denomina descriptor de un proceso y puede definirse como la fotografía que tiene el sistema operativo del proceso.

Un descriptor de proceso contendrá fundamentalmente: valores actuales del contador de programa, de los registros y de las variables; archivos abiertos; etc. Gracias a los descriptores de proceso, el sistema operativo es capaz de interrumpir un proceso, ceder todos los recursos de la máquina a otro proceso entrante, y después de un tiempo, volver a retomar el primero de los procesos justo por el punto por donde fue interrumpido. A esta operación se la denomina cambio de contexto. Un cambio de contexto es una operación considerablemente pesada, ya que supone guardar toda la información del proceso saliente y restaurar la del proceso entrante.

El concepto de hilo de proceso (thread) nace con el fin de intentar separar dos aspectos de diseño: concurrencia y protección. Un hilo de proceso se puede definir como un hilo de

ejecución dentro de un proceso. Los hilos de un mismo proceso comparten casi todo:

ficheros abiertos, espacio de memoria, información de protección, temporizadores, señales, etc. Al mismo tiempo, cada hilo tiene también su parte privada: su propia pila, su propio contador de programa y su propio estado.

En Java utilizamos la clase Thread para crear un nuevo thread:

public class EjemploProceso

{

public static void main( String arg[] )

{

System.out.println( "Creando un thread" ); Thread t = new Thread(); System.out.println( "Iniciando el thread" ); t.start();

}

}

Código 1 (EjemploProceso.java)

Al ejecutar este código, solo observaremos las frases:

Creando un thread Iniciando el thread

Si revisamos la clase Thread, tendremos lo siguiente:

Se observa que la clase Thread cuenta con el método run() el cual es un

Se observa que la clase Thread cuenta con el método run() el cual es un método vacío y no hace absolutamente nada. Para comprobar esto, haremos una modificación al código anterior:

public class EjemploProceso

{

 

public static void main( String arg[] )

{

System.out.println( "Creando un thread" ); Thread t = new Thread(); System.out.println( "Iniciando el thread" ); t.start();

}

public void run()

{

System.out.println( "Ejecutando el thread" );

}

}

Código 2 (EjemploProceso.java)

Al ejecutar este código, solo observaremos las frases:

Creando un thread

Iniciando el thread

Porqué no imprimió la frase “Ejecutando el thread”? Se debe a que creamos una instancia de la clase Thread por lo que al invocar al método start() ejecutó el método run() de la clase Thread y no el método propio de la clase EjemploProceso.

Hay 2 maneras de crear un nuevo hilo de ejecución (o thread): una es declarar a la clase como subclase de Thread e implementar el método run(). La otra opción es que la clase implemente a la interface Runnable.

Para que se imprima la frase, hay que modificar el código nuevamente, haciendo la opción 1:

public class EjemploProceso2 extends Thread

{

 

public static void main( String arg[] )

{

System.out.println( "Creando un thread" ); EjemploProceso2 t = new EjemploProceso2(); System.out.println( "Iniciando el thread" ); t.start();

}

public void run()

{

System.out.println( "Ejecutando el thread" );

}

}

Código 3 (EjemploProceso2.java)

Creando un thread Iniciando el thread Ejecutando el thread

Ahora crearemos 2 procesos de una misma clase:

public class EjemploProceso3 extends Thread

{

 

public static void main( String args[] )

{

// Para crear un Thread se debe extender a Thread // y crear objetos de tipo EjemploProceso3 System.out.println( "Creando thread" ); EjemploProceso3 t1 = new EjemploProceso3(); EjemploProceso3 t2 = new EjemploProceso3(); t1.setName( "proceso1" ); t2.setName( "proceso2" ); System.out.println( "Iniciando thread" );

t1.start();

t2.start();

}

public void run()

{

System.out.println( "Ejecutando thread" );

}

}

Código 4 (EjemploProceso3.java)

Creando thread Iniciando thread Ejecutando thread Ejecutando thread

Se observa que se imprime 2 veces la frase Ejecutando thread ya que se generaron 2 procesos por lo que ambos entran al método o función run().

Ahora: Cómo saber cuál de los 2 imprimió la frase?

Con el nombre que se le da a cada proceso podemos saber cual de los 2 es el actual en ejecución:

public class EjemploProceso4 extends Thread

{

public static void main( String args[] )

{

// Para crear un Thread se debe extender a Thread // y crear objetos de tipo EjemploProceso4 System.out.println( "Creando thread" ); EjemploProceso4 t1 = new EjemploProceso4(); EjemploProceso4 t2 = new EjemploProceso4(); t1.setName( "proceso1" ); t2.setName( "proceso2" ); System.out.println( "Iniciando thread" );

t1.start();

t2.start();

}

public void run()

{

System.out.println( "Ejecutando thread" ); for(int i=0; i <= 10; i++ )

{

System.out.println( Thread.currentThread().getName() +

:+ i );

}

}

}

Código 5 (EjemploProceso4.java)

Se observa que la salida no siempre es la misma.