Multi Hi Lo Java

30
  Programación Orientada a Objetos Trabajo Teórico Mayo, 2004 Multihilo en Java Raúl Herrero Pascual Rubén Montero Diez Departamento de Informática y Automática Universidad de Salamanca 

Transcript of Multi Hi Lo Java

Page 1: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 1/29

 Programación Orientada a Objetos

Trabajo Teórico

Mayo, 2004 

Multihilo en Java

Raúl Herrero PascualRubén Montero Diez 

Departamento de Informática y AutomáticaUniversidad de Salamanca 

Page 2: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 2/29

Información de los autores:

Raúl Herrero Pascual

Departamento de Informática y AutomáticaFacultad de Ciencias - Universidad de SalamancaPlaza de la Merced S/N – 37008 - [email protected]

Rubén Montero DiezDepartamento de Informática y AutomáticaFacultad de Ciencias - Universidad de SalamancaPlaza de la Merced S/N – 37008 - [email protected] 

Este documento puede ser libremente distribuido.© Programación Orientada a Objetos 2004

Page 3: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 3/29

 

Programación Orientada a Objetos - 2004 I

Resumen

En este documento se recogen los detalles fundamentales del manejo de threads en Java. Nopretende ser más que una introducción a este tema en concreto, tratando simplemente de

comentar las operaciones que se pueden realizar sobre ellos y explicar algunos detalles de suimplementación.

Estas operaciones nos determinarán los diferentes estados del ciclo de vida por el que pasaun thread , también se explican algunas formas de sincronización para evitar problemas deconcurrencia, y por último las prioridades de los hilos para que estos se ejecuten en undeterminado orden. 

Abstract

In this document the basic details for working with threads in Java are presented. It only intentto be an introduction to this specific subject, we only try to comment the operations that we canrealize with them and explain some details of them implementation.

This operations decides the different states of the life’s cycle that a thread does, some waysof synchronization for preventing turnout problems are also explain, and finally thread’spriorities for that threads are executed in a fixed order.

Page 4: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 4/29

 

II  Programación Orientada a Objetos - 2004

Tabla de Contenidos

1.  Introducción ______________________________________________ 1 

2.  Multitarea y multihilo ____________________________________ 1 

2.1.  Programas de flujo único ____________________________________ 2 

2.2.  Programas de flujo múltiple __________________________________ 2 

3.  Creación de threads _____________________________________ 3 

3.1.  Construcción de una clase derivada de Thread ________________ 3 

3.2.  Implementación del Interface Runnable _______________________ 4 

4.  Paso de parámetros a los threads ____________________ 6  

5.  Ciclo de vida de un thread _____________________________ 7  

5.1.  La clase Thread _____________________________________________ 7 

5.2.  Métodos de Clase  ___________________________________________ 7 

5.3.  Métodos de Instancia ________________________________________ 7 

5.4.  Estados de un Thread  _______________________________________ 9 

6.  Sincronización __________________________________________ 11 

6.1.  Ejemplo ____________________________________________________ 14 

7.  Prioridades y threads daemon _______________________ 19 

7.1.  Conmutación de contexto ___________________________________ 19 

7.2.  Threads daemon ___________________________________________ 20 

8.  Grupos de hilos _________________________________________ 20 

9.  Comentario _______________________________________________ 21 

10.  Conclusiones ____________________________________________ 22 

11.  Referencias ______________________________________________ 23 

12.  Bibliografía _______________________________________________ 23 

Page 5: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 5/29

 

Programación Orientada a Objetos - 2004 III

Tabla de Ilustraciones 

Figura 1. Disputa de CPU entre procesos pesados ____________________________ 2 Figura 2. Visualización de la salida de ThredEjemplo _________________________ 4 Figura 3. Estados de un thread ___________________________________________ 9 Figura 4. Situación de los filósofos comilones_______________________________ 14 Figura 5. Visualización de la salida del problema de los filósofos comilones ______ 18 

Page 6: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 6/29

Page 7: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 7/29

 

- 1 -

1. Introducción

Actualmente los procesadores y los sistemas operativos permiten la multitarea, es decir, larealización simultánea de dos o más actividades, al menos aparentemente. En la realidad, unordenador con una sola CPU no puede realizar dos actividades a la vez. Sin embargo lossistemas operativos modernos son capaces de ejecutar varios programas "simultáneamente"aunque sólo dispongan de una CPU, para ello reparten el tiempo entre dos o más actividades, obien utilizan los tiempos muertos de una actividad, como por ejemplo en las operaciones delectura de datos desde el teclado, para trabajar en la otra. Mientras que en ordenadores con dos omás procesadores la multitarea es real, ya que cada procesador puede ejecutar un hilo o thread  diferente.

Un proceso es un programa ejecutándose de forma independiente y con un espacio propiode memoria, un sistema operativo multitarea es capaz de ejecutar más de un procesosimultáneamente. Un thread o hilo es un flujo secuencial simple dentro de un proceso, un únicoproceso puede tener varios hilos ejecutándose. Por ejemplo el programa Netscape sería un

proceso, mientras que cada una de las ventanas que se pueden tener abiertas simultáneamentetrayendo páginas HTML estaría formada por al menos un hilo.

Sin el uso de threads hay tareas que son prácticamente imposibles de ejecutar, en particularlas que tienen tiempos de espera importantes entre etapas. Los threads o hilos de ejecuciónpermiten organizar los recursos del ordenador de forma que pueda haber varios programasactuando en paralelo. Un hilo de ejecución puede realizar cualquier tarea que pueda realizar unprograma normal y corriente. Bastará con indicar lo que tiene que hacer en el método run(),que es el que define la actividad principal de las threads. 

2. Multitarea y multihilo 

Muchos entornos tienen la llamada multitarea en su sistema operativo, esto es distinto almultihilo. En un sistema operativo multitarea a las tareas se les llama procesos pesados,mientras que en un entorno multihilo se les denomina procesos ligeros o hilos, la diferencia esque los procesos pesados están en espacios de direccionamiento distintos y por ello lacomunicación entre procesos y el cambio de contexto es caro. Por el contrario, los hiloscomparten el mismo espacio de direcciones y comparten cooperativamente el mismo procesopesado, cada hilo guarda su propia pila, variables locales y contador de programa, por ello, lacomunicación entre hilos es muy ligera y la conmutación de contexto muy rápida.

En la Figura 1 observamos cómo sobre una CPU pueden estar ejecutándose distintos

procesos pesados y uno de ellos puede estar compuesto por distintos flujos de ejecución(threads o hebras o hilos). Estos threads tendrán que “disputarse” el tiempo de ejecución que elsistema operativo le dé al proceso en el que residen.

Page 8: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 8/29

Multihilo Java

Programación Orientada a Objetos - 2004 2

Figura 1. Disputa de CPU entre procesos pesados

2.1. Programas de flujo único  Un programa de flujo único o single-threaded utiliza un único flujo de control para controlar suejecución. Muchos programas no necesitan la potencia o utilidad de múltiples flujos de control,sin necesidad de especificar explícitamente que se quiere un único flujo de control.

Por ejemplo: 

public class HolaMundo {

static public void main( String args[] ) {

System.out.println( "Hola Mundo" );

}

Aquí, cuando se llama a main(), la aplicación imprime el mensaje y termina. Esto ocurredentro de un único thread , un único hilo de ejecución. 

2.2. Programas de flujo múltiple  En el ejemplo anterior no vemos el thread que ejecuta nuestro programa, se crea y se ejecuta deforma implícita, sin embargo Java posibilita la creación y control de threads explícitamente. La

utilización de threads en Java permite una enorme flexibilidad a los programadores a la hora deplantearse el desarrollo de aplicaciones. La simplicidad para crear, configurar y ejecutarthreads, permite que se puedan implementar aplicaciones poderosas y portables que no se puedecon otros lenguajes de tercera generación. Esta herramienta es fundamental en un lenguaje conmarcada orientación a Internet como es Java.

Las aplicaciones multithreaded  utilizan muchos contextos de ejecución para cumplir sutrabajo, utilizan el hecho de que muchas tareas contienen subtareas distintas e independientes,pudiendo utilizar un thread para cada subtarea.

Mientras que los programas de flujo único pueden realizar su tarea ejecutando las subtareassecuencialmente, un programa multithreaded permite que cada thread comience y termine tanpronto como sea posible. Este comportamiento presenta una mejor respuesta a la entrada en

tiempo real. 

Page 9: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 9/29

Herrero y Montero

3 Programación Orientada a Objetos - 2004

3. Creación de threads

Lo primero que hay que realizar para poder utilizar un thread es crearlo. El programador puedeelegir cualquiera de las dos posibilidades que proporciona Java, y que como explica Pedro

Manuel Cuenca en su libro [1], se describen a continuación.

3.1. Construcción de una clase derivada de Thread  

La funcionalidad básica de un thread esta implementada en la clase Thread. Cualquier claseque derive de esta puede construir un hilo de ejecución independiente, para lo cual basta conque sobrescriba el método run(). En este método hay que incluir el código que deseamos quese ejecute en paralelo con otras tareas. Para que comience la ejecución del thread , debeinvocarse el método start(), que después de realizar los preparativos convenientes invoca asu vez a run().

El siguiente ejemplo demuestra la creación de un thread del modo descrito:

public class ThreadEjemplo extends Thread {

public ThreadEjemplo(String str) {

super(str);

}

public void run() {

for (int i = 0; i < 10 ; i++)

System.out.println(i + " " + getName());

System.out.println("Termina thread " + getName());

}

public static void main (String [] args) {new ThreadEjemplo("Pepe").start();

new ThreadEjemplo("Juan").start();

System.out.println("Termina thread main");

}

}

Notas sobre el programa:

•  El constructor public Thread(String str) recibe un parámetro que es laidentificación del thread .

  El método run() contiene el bloque de ejecución del thread . Dentro de él, el métodogetName() devuelve el nombre del thread , es decir, el que se ha pasado comoargumento al constructor.

•  El método main() crea dos objetos de clase ThreadEjemplo y los inicia con lallamada al método start(), dicho método después de iniciar el nuevo thread llama almétodo run().

•  En la salida el primer mensaje que se visualizará será el de finalización del thread  main. La ejecución de los threads es asíncrona. Realiza la llamada al método start(), éste le devuelve el control y continua su ejecución independientemente delos otros threads.

•  En la salida los mensajes de un thread  y otro se van mezclando ya que la máquina

virtual asigna tiempos a cada thread .

Page 10: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 10/29

Multihilo Java

Programación Orientada a Objetos - 2004 4

En la Figura 2 se puede observar una de las posibles salidas por pantalla que se puedenobtener al ejecutar este programa.

Figura 2. Visualización de la salida de ThredEjemplo

3.2. Implementación del Interface Runnable  

Construir una clase derivada de Thread presenta el gran inconveniente de que para poder crearun thread es necesario que la clase que contiene el código que se desea ejecutar en paraleloderive de Thread. Esta limitación es muy importante ya que Java no dispone de herenciamúltiple y por ello no podremos crear un thread con cualquier clase arbitraria que herede sufuncionalidad de otras que sean de nuestro interés.

Para solventar este problema, puede utilizarse un segundo mecanismo para la creación deun thread . Este mecanismo consiste en que la clase de nuestro interés implemente el interface Runnable, y a continuación crearíamos un nuevo thread utilizando uno de los constructores

de la clase Thread, que admite como argumento cualquier objeto que implemente Runnable.Este técnica no supone ninguna restricción, pues una clase puede implementar cualquier númerode interfaces.

El interface Runnable únicamente define un método denominado run() y al igual quesucedía en el caso anterior, debemos colocar dentro del mismo el código que deseamos que seejecute en paralelo con otros threads.

Page 11: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 11/29

Herrero y Montero

5 Programación Orientada a Objetos - 2004

El siguiente ejemplo es equivalente al del apartado anterior, pero utilizando la interfaceRunnable: 

public class ThreadEjemplo implements Runnable {

public void run() {for (int i = 0; i < 5 ; i++)

System.out.println(i + " " +

Thread.currentThread().getName());

System.out.println("Termina thread " +

Thread.currentThread().getName());

}

public static void main (String [] args) {

new Thread ( new ThreadEjemplo() , "Pepe").start();

new Thread ( new ThreadEjemplo() , "Juan").start();

System.out.println("Termina thread main");

}

}

Notas sobre el programa: 

•  Se implanta la interface Runnable en lugar de extender la clase Thread.•  El constructor que había antes no es necesario.•  En el main() se puede observar la forma en que se crea el thread , esa expresión es

equivalente a: 

ThreadEjemplo ejemplo = new ThreadEjemplo();

Thread thread = new Thread ( ejemplo , "Pepe");

thread.start();

o  Primero se crea la instancia de nuestra clase.o  Después se crea una instancia de la clase Thread, pasando como parámetros la

referencia de nuestro objeto y el nombre del nuevo thread .o  Por último se llama al método start() de la clase Thread. Este método

iniciará el nuevo thread y llamará al método run() de nuestra clase.•  Por último, obsérvese la llamada al método getName() desde run(). getName() 

es un método de la clase Thread, por lo que nuestra clase debe obtener una referenciaal thread propio. Es lo que hace el método estático currentThread() de la claseThread.

Page 12: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 12/29

Multihilo Java

Programación Orientada a Objetos - 2004 6

4. Paso de parámetros a los threads 

El método run() no toma argumentos, sin embargo, en muchas ocasiones es necesario pasarleparámetros a un thread . Esto se puede conseguir encapsulando el thread en una clase y pasando

los parámetros al constructor de la misma para almacenarlos en variables locales. En elsiguiente ejemplo consideramos una aplicación que crea un nuevo esclavo en un thread por cadanuevo trabajo que le llega.

class Parametros implements Runnable

{

private int parm1;

private int parm2;

private Thread me;

public Parametros (int p1, int p2, String nombre)

{

parm1 = p1;

parm2 = p2;

me = new Thread (this,nombre);

me.start();

}

public void run()

{

if (me == Thread.currentThread())

{

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

+"\n\tp1 = "+ parm1 + "\n\tp2 = " + parm2);

}

}

public static void main (String[] args)

{

new Parametros(4,5,"Hilo 1");

new Parametros(7,9,"Hilo 2");

}

}

Esto imprimiría:

Hilo 1p1 = 4p2 = 5

Hilo 2p1 = 7p2 = 9 

Page 13: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 13/29

Herrero y Montero

7 Programación Orientada a Objetos - 2004

5. Ciclo de vida de un thread 

5.1. La clase Thread  

Es la clase que encapsula todo el control necesario sobre los hilos de ejecución (threads). Hayque distinguir claramente un objeto Thread de un hilo de ejecución o thread . Esta distinciónresulta complicada, aunque se puede simplificar si se considera al objeto Thread como elpanel de control de un hilo de ejecución. La clase Thread es la única forma de controlar elcomportamiento de los hilos y para ello se sirve de los métodos que se exponen a continuación.

5.2. Métodos de Clase  

Estos son los métodos estáticos que deben llamarse de manera directa en la clase Thread. 

  currentThread(): este método devuelve el thread que se está ejecutando en estemomento, es decir, aquél desde donde se produjo la invocación acurrentThread(). 

  yield(): este método libera el procesador para que pueda ser utilizado por otrosthreads. Esto no significa que el thread  se detenga definitivamente, sino quesimplemente indica al planificador que pase a ejecutar otro thread . El thread que invocóa yield() se volverá a ejecutar cuando le toque el turno de nuevo.

  sleep(long): este método interrumpe la ejecución del hilo en curso durante el

número de milisegundos que se indiquen en el parámetro de tipo long. Una veztranscurridos esos milisegundos, dicho hilo volverá a estar disponible para su ejecución.

  activeCount(): este método devuelve el número de threads activos dentro delgrupo donde está incluido el thread en ejecución.

5.3. Métodos de Instancia 

  start(), stop(), run(), destroy(): estos métodos son los que controlanel funcionamiento básico del thread . El método start() se invoca cuando se desea

comenzar la ejecución del thread . La implementación de la clase Thread realizadiversas tareas de iniciación antes de pasar a invocar el método run(). Elprogramador puede utilizar start() para añadir código adicional de inicialización,aunque esto sólo es posible si se crea una subclase de Thread. Como puedeimaginarse, stop() sirve para indicar al thread  que debe terminar su ejecución,mientras que destroy() tiene como cometido liberar todos los recursos que pudieranestar empleándose.

  getName(), setName(): los threads pueden tener asociado un nombre, lo quefacilita las labores de depuración o incluso la creación de trazas en el código parasupervisar la ejecución, una de las formas para asignar este nombre es mediante el

método setName(). En cuanto a la depuración cabe destacar que la realización de

Page 14: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 14/29

Multihilo Java

Programación Orientada a Objetos - 2004 8

programas con varios threads es considerablemente más compleja y difícil de depurarque el desarrollo de aplicaciones sin esta capacidad.Además del método setName(), existen constructores de la clase Thread en losque se pueden especificar el nombre que se desea asignar.

  getPriority(), setPriotity(): puede asignarse una prioridad a cadathread, de modo que se asigne más tiempo de ejecución a los threads más prioritarios.Esto es todo lo que Java permite profundizar sobre el estudio de la prioridad, siendoimposible conocer cómo se realizará la planificación entre threads de igual prioridad.La prioridad de un thread ha de estar comprendida entre los valores MIN_PRIORITY yMAX_PRIORITY. Cuando se crea un thread , recibe por defecto la prioridadNORM_PRIORITY.

  getThreadGroup(): este método obtiene el grupo donde está contenido el thread .No existe un método setThreadGroup(), por consiguiente, debe emplearse algunaversión del constructor para indicar el grupo a donde se desea que pertenezca el thread .

  suspend(): el método suspend() es distinto de stop(). suspend() toma elhilo y provoca que se detenga su ejecución sin destruir el hilo. Si la ejecución de un hilose suspende, puede llamarse a resume() sobre el mismo hilo para lograr que vuelva aejecutarse de nuevo.

  resume(): el método resume() se utiliza para revivir un hilo suspendido. No haygarantías de que el hilo comience a ejecutarse inmediatamente, ya que puede haber unhilo de mayor prioridad en ejecución actualmente, pero resume() ocasiona que el hilovuelva a ser un candidato a ser ejecutado.

  isAlive(): el interfaz de programación de la clase Thread incluye el métodoisAlive(), que devuelve true si el hilo ha sido arrancado (con start()) y no hasido detenido (con stop()). Por ello, si el método isAlive() devuelve  false; sabemos que estamos ante un Nuevo thread  o ante un thread  Muerto, y si devuelvetrue; se sabe que el hilo se encuentra en estado Ejecutable o Parado, todos estos estadosse explican en el siguiente apartado. No se puede diferenciar entre Nuevo thread  yMuerto, ni entre un hilo Ejecutable o Parado.

  join(): este método detiene el hilo actual hasta que termine el hilo sobre el que sellama join(). Es usado por tanto para que unos hilos esperen a la finalización deotros. 

Se acaban de explicar los métodos de clase y métodos de instancia más interesantes dentrodel ámbito de este trabajo. Pero existen muchos más y se pueden consultar en la página web deSun [2].

Page 15: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 15/29

Herrero y Montero

9 Programación Orientada a Objetos - 2004

5.4. Estados de un Thread  

Durante el ciclo de vida de un hilo, éste se puede encontrar en diferentes estados. En la Figura 3se muestran los estados y algunos métodos que provocan el paso de un estado a otro.

Figura 3. Estados de un thread 

5.4.1 Nuevo thread

Las siguientes sentencias crean un nuevo hilo de ejecución pero no lo arrancan, lo dejan en elestado de Nuevo thread :

Thread MiThread = new MiClaseThread("hiloA");

Thread MiThread = new Thread( new UnaClaseThread,"hiloA");

Cuando un hilo está en este estado, es simplemente un objeto Thread vacío. El sistema noha destinado ningún recurso para él, únicamente memoria. Desde este estado solamente puedearrancarse llamando al método start(), o detenerse definitivamente, llamando al métodostop(). La llamada a cualquier otro método carece de sentido y lo único que provocará será lageneración de una excepción de tipo IllegalThreadStateException. 

5.4.2 Ejecutable

Obsérvense las dos líneas de código siguientes: 

Thread MiThread = new MiClaseThread();

MiThread.start();

La llamada al método start() reservará los recursos del sistema necesarios para que elhilo pueda ejecutarse, lo incorpora a la lista de procesos disponibles para ejecución del sistema y

llama al método run() del hilo de ejecución. En este momento se encuentra en el estado

Page 16: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 16/29

Multihilo Java

Programación Orientada a Objetos - 2004 10

Ejecutable del diagrama. Y este estado es Ejecutable y no En Ejecución, porque cuando el hiloestá aquí no significa que esté corriendo. Muchos ordenadores tienen solamente un procesadorlo que hace imposible que todos los hilos estén corriendo al mismo tiempo. Java implementa untipo de scheduling o lista de procesos, que permite que el procesador sea compartido entre todos

los procesos o hilos que se encuentran en la lista.Cuando el hilo se encuentra en este estado, todas las instrucciones de código que se

encuentren dentro del bloque declarado para el método run(), se ejecutarán secuencialmente. 

5.4.3 Parado

Un hilo de ejecución entra en estado Parado cuando alguien llama al método suspend(),cuando se llama al método sleep(), cuando el hilo está bloqueado en un proceso deentrada/salida o cuando el hilo utiliza su método wait() para esperar a que se cumpla unadeterminada condición. 

Por ejemplo, en el trozo de código siguiente: Thread MiThread = new MiClaseThread();

MiThread.start();

try {

MiThread.sleep( 10000 );

} catch( InterruptedException e ) {}

la línea de código que llama al método sleep() hace que el hilo se duerma durante 10segundos. Durante ese tiempo, incluso aunque el procesador estuviese totalmente libre,MiThread no correría. Después de esos 10 segundos MiThread volvería a estar en estadoEjecutable y ahora sí que el procesador podría hacerle caso cuando se encuentre disponible.

Los métodos de recuperación del estado Ejecutable, en función de la forma de llegar alestado Parado del hilo, son los siguientes: 

•  Si un hilo está dormido, pasado el tiempo especificado en el sleep().•  Si un hilo de ejecución está suspendido, después de una llamada a su método

resume().•  Si un hilo está bloqueado en una entrada/salida, una vez que el comando de

entrada/salida concluya su ejecución.•  Si un hilo está esperando por una condición, cada vez que la variable que controla esa

condición varíe debe llamarse al método notify() o notifyAll() .

5.4.4 Muerto

Un hilo de ejecución se puede morir de dos formas: por causas naturales o porque lo maten (constop()). Un hilo muere normalmente cuando concluye su método run().

Por ejemplo, en el siguiente trozo de código:

public void run() {

int i=0;

while( i < 20 ) {

i++;

System.out.println( "i = " + i );

}} 

Page 17: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 17/29

Herrero y Montero

11 Programación Orientada a Objetos - 2004

un hilo morirá de forma natural después de que se complete el bucle y run() concluya.

También se puede matar en cualquier momento un hilo, invocando a su método stop(),en el trozo de código siguiente:

Thread MiThread = new MiClaseThread();MiThread.start();

try {

MiThread.sleep( 10000 );

} catch( InterruptedException e ) {} MiThread.stop();

se crea y arranca el hilo MiThread, se duerme durante 10 segundos y en el momento dedespertarse, la llamada al método stop() lo mata.

El método stop() envía un objeto ThreadDeath al hilo de ejecución que quieredetener. Así, cuando un hilo es parado de este modo, muere asíncronamente. El hilo morirá en el

momento en que reciba ese objeto ThreadDeath.Los applets utilizarán el método stop() para matar a todos sus hilos cuando el navegador

con soporte Java en el que se están ejecutando le indica al applet que se detengan, por ejemplo,cuando se minimiza la ventana del navegador o cuando se cambia de página. 

6. Sincronización 

La sincronización surge debido a la necesidad de evitar que dos o más threads traten de accedera los mismos recursos al mismo tiempo. Por ejemplo si un thread  tratara de escribir en un

fichero y otro thread estuviera al mismo tiempo tratando de borrar dicho fichero, se produciríauna situación no deseada. También habría que sincronizar hilos cuando un thread debe esperar aque estén preparados los datos que le debe suministrar otro thread . Para solucionar estos tiposde problemas es importante poder sincronizar los distintos threads.

Las secciones de código de un programa que acceden a un mismo recurso (un mismoobjeto de una clase, un fichero del disco, etc.) desde dos threads distintos se denominansecciones críticas. Para sincronizar dos o más threads, hay que utilizar el modificadorsynchronized en aquellos métodos del objeto o recurso con los que puedan producirsesituaciones conflictivas. De esta forma Java bloquea, asocia un bloqueo o lock, el recursosincronizado. Por ejemplo:

public synchronized void metodoSincronizado() {

...// código de la sección critica} 

La sincronización previene las interferencias solamente sobre un tipo de recurso: lamemoria reservada para un objeto. Cuando se prevea que unas determinadas variables de unaclase pueden tener problemas de sincronización, se deberán declarar como private oprotected. Así solamente serán accesibles a través de métodos de la clase, los cualesdeberán estar sincronizados. Es muy importante tener en cuenta que si se sincronizan algunosmétodos de un objeto pero otros no, el programa puede que no funcione correctamente. Larazón es que los métodos no sincronizados pueden acceder libremente a las variables miembroignorando el bloqueo del objeto, sólo los métodos sincronizados comprueban si un objeto está

bloqueado.

Page 18: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 18/29

Multihilo Java

Programación Orientada a Objetos - 2004 12

Todos los métodos que accedan a un recurso compartido deben ser declaradossynchronized. De esta forma, si algún método accede a un determinado recurso Javabloquea dicho recurso, así logramos que el resto de threads no puedan acceder al mismo hastaque el primero en acceder termine de realizar su tarea. Bloquear un recurso u objeto significa

que sobre ese objeto no pueden actuar simultáneamente dos métodos sincronizados.En la sincronización se pueden utilizar dos niveles de bloqueo de un recurso, el primero es

a nivel de objetos, mientras que el segundo es a nivel de clases. El primero se consiguedeclarando todos los métodos de una clase como synchronized. Cuando se ejecuta unmétodo synchronized sobre un objeto concreto, el sistema bloquea dicho objeto, de formaque si otro thread  intenta ejecutar algún método sincronizado de ese objeto, este segundométodo se mantendrá a la espera hasta que finalice el anterior y desbloquee por lo tanto elobjeto. Si existen varios objetos de una misma clase, como los bloqueos se producen a nivel deobjeto, es posible tener distintos threads ejecutando métodos sobre diversos objetos de unamisma clase.

El bloqueo de recursos a nivel de clases se corresponde con los métodos de clase o

static, y por lo tanto con las variables de clase o static. Si lo que se desea es conseguirque un método bloquee simultáneamente una clase entera, es decir, todos los objetos creados deuna clase, será necesario declarar este método como synchronized static. Durante laejecución de un método declarado de esta segunda forma ningún método sincronizado tendráacceso a ningún objeto de la clase bloqueada.

La sincronización puede ser problemática y generar errores. Un thread podría bloquear undeterminado recurso de forma indefinida impidiendo que el resto de threads accedieran almismo, para evitar esto habrá que utilizar la sincronización sólo donde sea estrictamentenecesario.

Hay que tener presente que si dentro de un método sincronizado se utiliza el métodosleep() de la clase Thread, el objeto bloqueado permanecerá dormido durante el tiempoindicado en el argumento de dicho método. Esto implica que otros threads no podrán acceder aese objeto durante ese tiempo, aunque en realidad no exista peligro de simultaneidad ya quedurante ese tiempo el thread  que mantiene bloqueado el objeto no realizará cambios. Paraevitarlo es conveniente sustituir sleep() por el método wait(). Cuando se llama al métodowait(), que siempre debe hacerse desde un método o bloque synchronized, se libera elbloqueo del objeto y por lo tanto es posible continuar utilizando ese objeto a través de métodossincronizados. El método wait() detiene el thread hasta que se llame al método notify() o notifyAll() del objeto, o finalice el tiempo indicado como argumento del método wait().El método unObjeto.notify() lanza una señal indicando al sistema que puede activar unode los threads que se encuentren bloqueados esperando para acceder al objeto unObjeto. Elmétodo notifyAll() lanza una señal a todos los threads que están esperando la liberación

del objeto.

Los métodos notify() y notifyAll() deben ser llamados desde el thread que tienebloqueado el objeto para activar el resto de threads que están esperando la liberación de unobjeto. Un thread se convierte en propietario del bloqueo de un objeto ejecutando un métodosincronizado del objeto.

Observar las dos funciones siguientes, en las que put() inserta un dato y get() lorecoge:

Page 19: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 19/29

Herrero y Montero

13 Programación Orientada a Objetos - 2004

public synchronized int get() {

while (available == false) {

try {

wait();

} catch (InterruptedException e) { }

} available = false;

notifyAll();

return contents;

}

public synchronized void put(int value) {

while (available == true) {

try {

wait();

} catch (InterruptedException e) { }

}

contents = value;

available = true;

notifyAll();

}

Notas sobre el programa:

•  El bucle while de la función get() continúa ejecutándose (avalaible ==

false) hasta que el método put() haya suministrado un nuevo valor y lo indiquecon avalaible = true.

•  En cada iteración del while la función wait() hace que el hilo que ejecuta el

método get() se detenga hasta que se produzca un mensaje de que algo ha sidocambiado, en este caso con el método notifAll() ejecutado por put().

•  El método put() funciona de forma similar.

También existe la posibilidad de sincronizar una parte del código de un método sinnecesidad de mantener bloqueado el objeto desde el comienzo hasta el final del método. Paraello se utiliza la palabra clave syncronized indicando entre paréntesis el objeto que se deseasincronizar (synchronized(objetoASincronizar)). Por ejemplo si se deseasincronizar el propio thread en una parte del método run(), el código podría ser:

public void run() {

while(true) {

...syncronized(this) {

// El objeto a sincronizar es el propio thread

... // Código sincronizado

}

try {

sleep(2000);

// Se detiene el thread durante 2 segundos pero el objeto

// es accesible por otros threads al no estar sincronizado

} catch(InterruptedException e) {}

}

}

Page 20: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 20/29

Multihilo Java

Programación Orientada a Objetos - 2004 14

Un thread puede llamar a un método sincronizado de un objeto para el cual ya posee elbloqueo, volviendo a adquirir el bloqueo. Por ejemplo:

public class VolverAAdquirir {

public synchronized void a() {

b();System.out.println("Estoy en a()");

}

public synchronized void b() {

System.out.println("Estoy en b()");

}

}

El anterior ejemplo obtendrá como salida:

Estoy en b()Estoy en a()

debido a que se ha podido acceder al objeto con el método b() al ser el thread que ejecuta elmétodo a() propietario con anterioridad del bloqueo del objeto.

El proceso de sincronización lleva bastante tiempo a la CPU, por ello se debe minimizar suuso ya que el programa será más lento cuanta más sincronización incorpore.

6.1. Ejemplo  

EL PROBLEMA DE LOS FILÓSOFOS COMILONES. 

Cinco filósofos pasan su vida pensando y comiendo. Los filósofos comparten una mesacircular rodeada por cinco sillas, una para cada uno de ellos. En el centro de la mesa seencuentra una fuente de arroz, y también sobre la mesa hay cinco palillos chinos. Cuando unfilósofo piensa, no interactúa con sus colegas. Ocasionalmente, un filósofo tiene hambre y tratade coger los dos palillos que están más cerca de él (los palillos colocados entre él y sus vecinosde la derecha y de la izquierda). Un filósofo sólo puede coger un palillo a la vez y, obviamente,no puede ser el que está en la mano de un vecino. Cuando un filósofo hambriento tiene sus dospalillos al mismo tiempo, come sin soltarlos. Cuando termina de comer, coloca ambos palillossobre la mesa y comienza a pensar otra vez.

La situación de los Filósofos comelones se puede observar en la Figura 4.

Figura 4. Situación de los filósofos comilones 

Page 21: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 21/29

Herrero y Montero

15 Programación Orientada a Objetos - 2004

class semAforo

{

private int valor=1;

synchronized void decrementar()

{

while(valor<=0)

{

try{

wait();

}catch(InterruptedException e)

{}

}

valor--;

}

synchronized void incrementar()

{

valor++;

notify();

}

}

class pensadores1 extends Thread

{

private int number;

private semAforo palillo_izq;

private semAforo palillo_der;

long dormir;Random alea=new Random(1);

public pensadores1(semAforo izq,semAforo der,int num)

{

palillo_izq=izq;

palillo_der=der;

this.number=num;

}

public void run()

{

for(;;){

palillo_izq.decrementar();

System.out.println("<"+this.number+"> Conseguido

palillo izquierdo");

palillo_der.decrementar();

System.out.println("<"+this.number+"> Conseguido

palillo derecho");

System.out.println("<"+this.number+"> Estoy

comiendo");

try {

dormir=(alea.nextInt(4))+10;

sleep(dormir*1000);

Page 22: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 22/29

Multihilo Java

Programación Orientada a Objetos - 2004 16

} catch (InterruptedException e)

{}

System.out.println("<"+this.number+"> Estoy

pensando");

palillo_izq.incrementar();

palillo_der.incrementar();

try {

dormir=(alea.nextInt(4))+5;

sleep(dormir*1000);

} catch (InterruptedException e)

{}

}

}

}

class pensadores2 extends Thread

{

private int number;

private semAforo palillo_izq;

private semAforo palillo_der;

long dormir;

Random alea=new Random(2);

public pensadores2(semAforo izq,semAforo der,int num)

{

palillo_izq=izq;

palillo_der=der;

this.number=num;

}

public void run()

{

for(;;)

{

palillo_der.decrementar();

System.out.println("<"+this.number+"> Conseguido

palillo derecho");

palillo_izq.decrementar();

System.out.println("<"+this.number+"> Conseguido

palillo izquierdo");

System.out.println("<"+this.number+"> Estoycomiendo");

try {

dormir=(alea.nextInt(4))+6;

sleep(dormir*1000);

} catch (InterruptedException e)

{}

System.out.println("<"+this.number+"> Estoy

pensando");

palillo_izq.incrementar();

palillo_der.incrementar();

try {

dormir=(alea.nextInt(4))+5;

Page 23: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 23/29

Herrero y Montero

17 Programación Orientada a Objetos - 2004

sleep(dormir*1000);

} catch (InterruptedException e)

{}

}

}

}

class probar

{

public static void main(String args[])

{

semAforo palillo1=new semAforo();

semAforo palillo2=new semAforo();

semAforo palillo3=new semAforo();

semAforo palillo4=new semAforo();

semAforo palillo5=new semAforo();

pensadores1 p1=new pensadores1(palillo1,palillo2,1);

pensadores2 p2=new pensadores2(palillo2,palillo3,2);

pensadores1 p3=new pensadores1(palillo3,palillo4,3);

pensadores2 p4=new pensadores2(palillo4,palillo5,4);

pensadores1 p5=new pensadores1(palillo5,palillo1,5);

try

{

p1.start();

p2.start();

p3.start();

p4.start();p5.start();

p1.join();

p2.join();

p3.join();

p4.join();

p5.join();

}catch(java.lang.InterruptedException ie)

{

System.out.println(ie);

}

}

}

Page 24: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 24/29

Multihilo Java

Programación Orientada a Objetos - 2004 18

En la Figura 5 se puede observar una de las posibles salidas por pantalla que se puedenobtener al ejecutar este programa. 

Figura 5. Visualización de la salida del problema de los filósofos comilones Notas sobre el programa:

•  Tenemos dos clases de pensadores; pensadores1 y pensadores2, que sediferencian en que uno coge primero el palillo izquierdo y otro el palillo derecho.Tenemos además otras dos clases; la clase semAforo y la clase probar que definiráel método main().

•  La clase semAforo tiene dos métodos; incrementar() y decrementar() quenos sirven para controlar que los palillos sólo sean utilizados por un solo filósofo, estose consigue haciendo que esta operación sea de forma atómica y así prevenir laconcurrencia, para ello se declaran como synchronized y se usan los métodoswait y notify.

•  La clase pensadores1 extiende la clase Thread (la hereda) y por ello no esnecesario implementar el Runnable. Esta clase además del constructor, tiene unmétodo run() que va a determinar las acciones a realizar por cada hilo, es decir, porcada filósofo. Estos lucharán por conseguir el palillo de su izquierda, a continuación elde la derecha, y posteriormente comerán. Después de comer, dormirán un tiempoaleatorio y los soltarán para que los demás los utilicen.

•  La clase pensadores2 es exactamente igual que la clase pensadores1 con lasalvedad de que el orden en coger los palillos es al contrario para evitar que se produzcaun interbloqueo debido a que todos los filósofos cojan su palillo izquierdo y esperen por

el derecho.

Page 25: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 25/29

Herrero y Montero

19 Programación Orientada a Objetos - 2004

•  La clase probar esta constituida por el método principal, es decir, el método main() que nos sirve para ejecutar el programa y utilizar las clases anteriormente definidas. Enél se instancian varios objetos, de los cuales los de la clase pensadores1 ypensadores2 llamarán al método start() para iniciar la ejecución de dichos hilos

(implícitamente se llamará también a run()) y se lleven a cabo las operacionesimplementadas, con lo que conseguiremos solucionar el problema. Por últimoesperamos por la finalización de los hilos mediante el método join().

7. Prioridades y threads daemon 

Para conseguir una correcta ejecución de un programa se establecen prioridades en los threads,de forma que se produzca un reparto más eficiente de los recursos disponibles. Así, en undeterminado momento, interesará que un determinado proceso acabe lo antes posible suscálculos, de forma que habrá que otorgarle más recursos, más tiempo de CPU. Esto no significaque el resto de procesos no requieran tiempo de CPU, sino que necesitarán menos. La forma dellevar a cabo esto es gracias a las prioridades.

Cuando se crea un nuevo thread , éste hereda la prioridad del thread desde el que ha sidoinicializado. Las prioridades vienen definidas por variables miembro de la clase Thread, quetoman valores enteros que oscilan entre la máxima prioridad MAX_PRIORITY (normalmentetiene el valor 10) y la mínima prioridad MIN_PRIORITY (valor 1), siendo la prioridad pordefecto NORM_PRIORITY (valor 5). Para modificar la prioridad de un thread  se utiliza elmétodo setPriority(). Se obtiene su valor con getPriority().

7.1. Conmutación de contexto 

Las reglas para la conmutación de contexto entre threads son sencillas. Un hilo puede cedervoluntariamente el control (por abandono explícito, al quedarse dormido o al bloquearse enespera de una E/S pendiente), o puede ser desalojado. En el primer caso, se examinan todos losdemás restantes y se selecciona aquel que, estando listo para su ejecución, tenga la prioridadmás alta, para su asignación a la CPU. En el segundo caso, un hilo de baja prioridad que nolibera la CPU es desalojado por otro de mayor prioridad, con independencia de lo que estuviesehaciendo en ese instante. En otras palabras, tan pronto como un hilo de mayor prioridad deseecomenzar su ejecución, lo hará. Esto se suele conocer como multitarea por desalojo.

En caso de tareas con igual prioridad se suele aplicar algún algoritmo de round-robin para

conmutar entre tareas.Un thread puede en un determinado momento renunciar a su tiempo de CPU y otorgárselo

a otro thread de la misma prioridad, mediante el método yield(), aunque en ningún caso a unthread de prioridad inferior.

Page 26: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 26/29

Multihilo Java

Programación Orientada a Objetos - 2004 20

7.2. Threads daemon  

Los threads pueden ser daemon o no daemon. Son daemon aquellos hilos que realizan enbackground (en un segundo plano) servicios generales, es decir, tareas que no forman parte de

la esencia del programa y que se están ejecutando mientras no finalice la aplicación. Un thread daemon podría ser por ejemplo aquél que está comprobando permanentemente si el usuariopulsa un botón. Un programa de Java finaliza cuando sólo quedan corriendo threads de tipodaemon. Por defecto, y si no se indica lo contrario, los threads son del tipo no daemon.

Los thread Daemon tienen la prioridad más baja. Se usa el método setDaemon (true) para marcar un thread  como thread  demonio y se usa getDaemon para comprobar eseindicador. Por defecto, la cualidad de demonio se hereda desde el thread  que crea el nuevothread . No puede cambiarse después de haber iniciado un thread .

8. Grupos de hilosCualquier hilo de ejecución en Java debe formar parte de un grupo, la clase ThreadGroup define e implementa la capacidad de un grupo de hilos.

Los grupos de hilos permiten que sea posible recoger varios hilos de ejecución en un soloobjeto y manipularlo como un grupo, en vez de individualmente. Por ejemplo, se puedenregenerar los hilos de un grupo mediante una sola sentencia.

Cuando se crea un nuevo hilo, se coloca en un grupo, bien indicándolo explícitamente, obien dejando que el sistema lo coloque en el grupo por defecto. Una vez creado el hilo yasignado a un grupo, ya no se podrá cambiar a otro grupo.

Si no se especifica un grupo en el constructor, el sistema coloca el hilo en el mismo grupoen que se encuentre el hilo de ejecución que lo haya creado, y si no se especifica el grupo paraninguno de los hilos, entonces todos serán miembros del grupo main, que es creado por elsistema cuando arranca la aplicación.

La clase Thread proporciona constructores en los que se puede especificar el grupo delhilo que se esta creando en el mismo momento de instanciarlo, y también métodos comogetThreadGroup(), que permiten determinar el grupo en que se encuentra un hilo deejecución.

Page 27: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 27/29

Herrero y Montero

21 Programación Orientada a Objetos - 2004

9. Comentario

La posibilidad de soportar varios threads nos proporciona una gran flexibilidad para el diseñode aplicaciones.

La especificación de Java sólo menciona que pueden utilizarse los recursos del sistemaoperativo subyacente si éste soporta multithreading, en caso contrario es la maquina virtualquien realiza todas las labores de planificación y cambio de contexto.

El comportamiento que puede esperar el programador del soporte de multithreading enJava no permite la realización de aplicaciones con fuertes requisitos temporales. No es posibletan siquiera cambiar la política de planificación de la maquina virtual, y lo que es peor, éstadepende de la plataforma en la que nos encontremos. Debido a estos motivos la utilización demultithreading en Java debe limitarse simplemente a situaciones donde sea conveniente tenervarias tareas en paralelo, sin que importe demasiado la precisión con que se reparten elprocesador o la frecuencia con que realizan cambios de contexto.

Existe un aspecto significativo y no intuitivo dentro de los hilos, y es que debido a laplanificación de los hilos, se puede hacer que una aplicación se ejecute generalmente más rápidoinsertando llamadas a sleep() dentro del bucle principal de run(). Debido a esto su usoparece un arte, sobre todo cuando unos retrasos más largos parecen incrementar el rendimiento.La razón por la que ocurre esto es que retrasos más breves pueden hacer que la interrupción delplanificador del final de sleep() se dé antes de que el hilo en ejecución este listo para ir adormir, forzando así al planificador a detenerlo y volver a arrancarlo más tarde para que puedaacabar con lo que estaba haciendo, para ir después a dormir.

Las desventajas principales del multihilado son:

1.  Ralentización durante la espera por recursos compartidos.2.  Sobrecarga adicional de la CPU necesaria para gestionar los hilos.

3.  Complejidad sin recompensa, como la idea poco acertada de tener un hijo separado paraactualizar cada elemento de un array.

4.  Problemas derivados como la inanición, la competición y el interbloqueo. 

Page 28: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 28/29

Multihilo Java

Programación Orientada a Objetos - 2004 22

10. Conclusiones

•  La programación de hilos requiere un cambio en la forma de pensar al programar, ya

que la ejecución del código ya no se realiza de forma secuencial sino paralelamente.•  Tiene suma importancia saber cuándo hay que hacer uso de threads y cuándo evitarlos.

Las principales razones de usarlos son al gestionar varias tareas que al entremezclarsehagan un uso más eficiente del ordenador, o porque al usuario le interese por unadeterminada circunstancia.

•  Un único hilo es similar a un programa secuencial; es decir, tiene un comienzo, unasecuencia y un final, además en cualquier momento durante la ejecución existe un sólopunto de ejecución. Sin embargo, un hilo no es un programa; no puede correr por sí mismo, corre dentro de un programa. Un hilo por si mismo no nos ofrece nada nuevo,es la habilidad de ejecutar varios hilos dentro de un programa lo que ofrece algo nuevoy útil, ya que cada uno de estos hilos puede ejecutar tareas distintas.

•  Una ventaja de usar hilos es que las conmutaciones de contexto de procesos ligeras,sustituyen a las conmutaciones de contexto de procesos pesadas. Debido a que todos loshilos de un determinado proceso comparten el mismo espacio de memoria, unaconmutación del proceso ligera sólo cambia la ejecución del programa y las variableslocales, mientras que una conmutación de contexto pesada debe intercambiar todo elespacio en memoria.

•  La mayor dificultad de trabajar con hilos es que dado un recurso, este podría estarsiendo compartido por más de un hilo. Por ello hay que asegurarse de que varios hilosno intenten leer y cambiar un recurso simultáneamente. Esto requiere de un usocuidadoso de synchronized, ya que aunque es una herramienta muy útil, puedellevar a situaciones de interbloqueo sin darnos cuenta.

•  Los programas paralelos son usados en ambientes críticos y muy sensibles tales comooperaciones y manipulación en bases de datos, recolección de información, etc. Con uncreciente énfasis en el Web y herramientas independientes de la plataforma, es por estoque Java ha tenido un gran impacto en la creación de nuevos sistemas paralelo. Elproblema es que Java soporta hilos, pero no ofrece una protección adecuada para losrecursos compartidos por los hilos y no tiene un mecanismo de detección deinterbloqueos.

•  En Java parece que existe un límite en la cantidad de hilos a crear, ya que en algunasocasiones un número de hilos muy elevado da muestras de colapso, este punto críticopuede que se alcance con unos pocos cientos. Normalmente sólo se crean unos pocos

hilos para solucionar un problema y por tanto este límite no se suele alcanzar, aunquepuede parecer una limitación en grandes diseños.

Page 29: Multi Hi Lo Java

5/12/2018 Multi Hi Lo Java - slidepdf.com

http://slidepdf.com/reader/full/multi-hi-lo-java-55a4d7657184d 29/29

Herrero y Montero

23 Programación Orientada a Objetos - 2004

11. Referencias 

[1] Pedro Manuel Cuenca Jiménez. “Programación en Java”. Guía Práctica paraprogramadores. Anaya Multimedia. 

[2] API de Java. Web Site.http://java.sun.com/j2se/1.4.2/docs/api/index.html [Última vez visitado, 8-6-2004]

12. Bibliografía

•  Ed Tittel, Bill Brogden. “Manual Fundamental de Java”. Anaya Multimedia. •  H. M. Deitel, P. J. Deitel . “Cómo programar en Java“. Prentice-Hall

Hispanoamericana. 1a. Ed.

•  Bruce Eckel; traducción, Jorge González Barturen.  “Piensa en Java “. PrenticeHall.

•  Roger Cadenhead. “Java 2 in 24 hours” . Sams Publising.

•  Página web con información acerca de varios lenguajes de programación en general, yde Java en particular. 

http://www.programacion.net/java/ [Última vez visitado, 8-6-2004] 

•  Página oficial de Sun dedicada al lenguaje Java. http://java.sun.com/ [Última vez visitado, 8-6-2004] 

•  Página con varios tutoriales sobre Java y threads. http://programacion.com/java/tutorial/threads/  [Última vez visitado, 8-6-2004] 

•  Página web en español dedicada íntegramente al lenguaje Java. http://www.javahispano.org/ [Última vez visitado, 8-6-2004] 

•  El rincón de Java.http://wwws.uib.es/rincon/java/ [Última vez visitado, 8-6-2004]