ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Definir el concepto de hilo (thread).

Ricardo MontesEnsayo22 de Mayo de 2016

7.627 Palabras (31 Páginas)302 Visitas

Página 1 de 31

El estudio de este módulo le proporcionará los conocimientos necesarios para:[pic 2][pic 3]

  • Definir el concepto de hilo (thread).
  • Crear diferentes hilos en un programa Java controlando el código y los datos usados por cada hilo.
  • Controlar la ejecución de un hilo y escribir código independiente de la plataforma con hilos.
  • Describir las dificultades que pueden surgir cuando varios hilos comparten los mismos datos.
  • Usar wait y notify para establecer la comunicación entre hilos.
  • Usar synchronized para proteger la integridad de los datos.

Este módulo cubre el procesamiento multihilo, que permite a un

programa ejecutar múltiples tareas al mismo tiempo.

Una forma simple de ver un PC seria considerarlo como un dispositivo dotado de una CPU que realiza los cálculos, una memoria que contiene el programa ejecutado por la CPU y una memoria que contiene los datos con los que opera el programa. Según esta perspectiva, sólo se lleva a cabo un trabajo. Una forma más completa de ver los sistemas informáticos modernos incluye la posibilidad de realizar más de un trabajo al mismo tiempo.

No debe preocuparse ahora de cómo se consigue el rendimiento para el procesamiento multitarea, tenga en cuenta únicamente las implicaciones desde el punto de vista de la programación. Llevar a cabo varios trabajos es como tener varios sistemas de computación. En lo que respecta a este módulo, un hilo, o contexto de ejecución, es el encapsulamiento de una CPU virtual con su propio código y datos de programa. La clase java. lang.Thread permite crear y controlar los hilos.

Nota: A lo largo del módulo, utilizaremos el término Thread para referirnos a la clase java.lang.Thread e hilo para referirnos a los contextos de ejecución.

Un hilo o contexto de ejecución se compone de tres partes fundamentales:

  • Una CPU virtual.
  • El código que ejecuta la CPU.
  • Los datos con los que trabaja el código.

Un proceso es un programa en ejecución. Uno o varios hilos constituyen un proceso. Un hilo se compone de la CPU, el código y los datos, como se ilustra en la Figura 15-1.

Hilo 0[pic 4]

contexto de ejecución

Figura 15-1 Partes de un hilo

T        A Sjt- * it[pic 5]

Hilo»


Varios hilos pueden íompartir el mismo código, con independencia de los datos Esto o( une cuando ejecutan código desde distintas instancias de la misma ciase.

De la misma forma, varios hilos pueden compartir los mismos datos, con independencia del código. Esto ocurre cuando comparten el acceso a un mismo objeto.

En programación lava, la CPU virtual se encapsula como una instancia de la í lase Thi ead. Cuando se construye un hilo, el código y los datos que dolmen su contexto vienen especificados por el objeto que se pasa a su v ons truc ton

Creación del hilo

En esta sección se explica la forma de crear un hilo y usar los argumentos del constructor para suministrar el código y los datos que utiliza el hilo durante su ejecución.

El constructor de Thread utiliza como argumento una instancia de Runnable. Esta instancia se crea a partir de una clase que implementa la interfaz Runnable (es decir, proporciona un método pubiic void run()).

Por ejemplo:

  1. pubiic class ThreadTester {
  2. pubiic        static void        main(String        args[]) {
  3. HelloRunner r = new HelloRunner();
  4. Thread t =        new        Thread(r);
  5. t.start();
  6. }
  7. }

8

  1. class HelloRunner implements Runnable {
  2. int i;

11

  1. pubiic        void run()        {
  2. i = 0;

14

  1. while (true)        {
  2. System.out.println("Hola " + i++);
  3. if ( i « 50 ) {
  4. break;

Lengua)» de programación Java

Copyright 200S aun Mteroiyatama, Irvc Todos toa darachoa matrvMto* Sun Strvka*. R*vta*on <32

  1. }
  2. }
  3. }
  4. }

En primer lugar, el método mam construye una instancia r de la clase HelloRunner. La instancia r tiene sus propios datos, en este caso, el entero i. Dado que la instancia, r, se ha pasado al constructor de la clase Thread, el entero i de r es el dato con el que el hilo debe trabajar durante su ejecución. F;.l hilo siempre empieza a ejecutarse en el método run de la instancia de Runnable que se haya cargado (en este caso x).

Los entornos de programación multihilo permiten crear múltiples hilos basados en la misma instancia de Runnable. Puede hacerlo de la siguiente manera:

Thread ti = new Thread(r);

Thread t2 = new Thread(r);

En este caso, ambos hilos comparten ¡os datos y el código.

En resumen, la referencia a un hilo se efectúa a través de una instancia de un objeto Thread. El hilo empieza a ejecutarse al principio del método run de la instancia de Runnable que se encuentre cargada. Los datos con los que trabaja el hilo se obtienen de la instancia concreta de Runnable, que se pasa al constructor de ese Thread (Figura 15-2).

Nuevo hilo

[pic 6]

Figura 15-2 Creación de hilos

Hilo»

Inicio del hilo

Los hilos recien creados no empiezan a ejecutarse de forma automática. Es necesario llamar a su método start;. Por ejemplo, puede ejecutar el comando siguiente, como en la línea 5 del ejemplo anterior:

t.start();

La llamada a start pone la CPU virtual encapsulada en el hilo en estado ejecutable, lo que significa que es posible planificar su ejecución por parte de la maquina virtual de Java (JVM). Esto no significa necesariamente que el hilo se ejecute de inmediato.

Planificación de la ejecución de los hilos

En programación Java, la ejecución de los hilos es apropiativa y no por asignación de cuantos de tiempo (time-sliced), con la que cada hilo recibiría una misma cantidad de tiempo de la CPU. Es un error habitual creer que apropiatiw es otra forma de decir asignación de tiempos.

El modelo de planificación apropiativa se basa en que, aunque puede haber muchos hilos ejecutables, en la práctica sólo se ejecuta uno. Este hilo se ejecuta hasta que deja de ser ejecutable o hasta que otro hilo de mayor prioridad se pone en estado ejecutable. En el último caso, el hilo de mayor prioridad se apropia del derecho de ejecución e interrumpe al de menor prioridad.

Un hilo puede dejar de ser ejecutable (es decir, quedar bloqueado) for diferentes motivos. Por ejemplo, el código del hilo puede ejecutar una llamada a Thread.sleepO para pedir al hilo que se detenga durante un determinado periodo de tiempo. También puede que el hilo tenga que esperar un recurso y no pueda continuar hasta que dicho recurso esté disponible.

Todos los hilos ejecutables se guardan en grupos formados en función de la prioridad. Cuando un hilo bloqueado se vuelve ejecutable, vuelve a colocarse en el grupo adecuado. Los hilos del grupo (no puede estar vacío) que tenga mayor prioridad reciben tiempo de la CPU.

Un objeto Thread puede pasar por diferentes estados a lo largo de su ciclo de vida, como se muestra en la Figura 15-3.

[pic 7]

Figura 15-3 Diagrama de estados fundamentales de los hilos

Aunque el hilo entre en estado ejecutable (runnable), no siempre empieza a ejecutarse de inmediato. En las máquinas con una CPU, sólo puede realizarse una acción en cada momento. En los párrafos siguientes se explica como se asignan los recursos de la CPU cuando hay varios hilos ejecutables.

Dado que los hilos de Java no se ejecutan por asignación de cuantos de tiemuo, debe asegurarse de que el código de sus hilos dé a los otros hilos la oportunidad de ejecutarse de vez en cuando. Esto puede conseguirse ejecutando la llamada sleep con diferentes intervalos, como se muestra en el Código 15-1.

Código 15-1 Ejemplo de planificación de hilos

  1. public class Runner implements Runnable {
  2. public void run() {
  3. while (true) {
  4. //        hacer        numerosas        tareas
  5. //        ...
  6. //        Dar        a        otros        hilos        una        oportunidad
  7. try {
  8. Thread.sleep(10);
  9. } catch (InterruptedException e) {
  10. // El periodo de espera de este hilo ha
  11. // sido interrumpido por otro hilo
  12. }
  13. }
  14. }

}

Hilos

CopyngM 2000 Sun Microsystems, inc Todos los derechos reservados Sun Services. Revisión G ?

Fi Código 15-1 de la página 15-7 muestra el uso del bloque try y catch. Thread.sleep() y otros métodos que detienen la ejecución de los hilos durante un tiempo pueden ser interrumpidos. Los hilos pueden llamar al método interrupt de otro hilo, lo que señala al hilo detenido con una

excepcion InterruptedExcept ion.

sleep es un método static de la clase Thread, ya que actúa sobre el hilo actual v se hace referencia a él como Thread.sleepfx). El argumento del método sleep indica la cantidad mínima de milisegundos que el hilo debe estar inactivo. 1.a ejecución del hilo no se reanuda hasta que finalice este periodo, a menos que sea interrumpido, en cuyo caso reanudará la ejecución antes.

...

Descargar como (para miembros actualizados) txt (42 Kb) pdf (653 Kb) docx (3 Mb)
Leer 30 páginas más »
Disponible sólo en Clubensayos.com