psp-b1 hilos y procesos

UT 1: concurrencia. programación multihilo

P1. HILOS Y PROCESOS

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

JUSTIFICACIÓN DEL LENGUAJE

  • Java es un lenguaje de propósito general muy utilizado en el entorno empresarial. 
  • Java tiene un gran soporte de librerías.
  • Java cuenta con una buena documentación.

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

  • HILOS Y PROCESOS
    • INTRODUCCIÓN
    • ESTADOS DE UN PROCESO
    • SIMILITUDES Y DIFERENCIAS
    • CONCEPTOS BÁSICOS DE HILOS
    • LA CLASE THREAD
    • INTERCALACIÓN DE TAREAS
    • PRIMER PROGRAMA CON HILOS
    • TÉCNICAS DE PROGRAMACIÓN

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

Antaño los programas solían ser secuenciales.

 

eugeniaperez.es

Línea de control de flujo

El tiempo no influye en el resultado

Presentaba limitaciones

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

Los programas concurrentes permiten ejecutar tareas simultáneamente 

eugeniaperez.es

Múltiples líneas de control de flujo

 

Mejora sustancial del rendimiento y velocidad

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

EJECUCIÓN SECUENCIAL TRADICIONAL

  • Método lento
  • Tiempo de CPU desaprovechado
  • Peor rendimiento

¿Posible solución?

 

Programación CONCURRENTE

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

EJECUCIÓN CONCURRENTE

  • Hace unos años los ordenadores solo disponían de un procesador
    • Repartir el tiempo de la CPU entre los procesos
  • Actualmente los equipos disponen de varios núcleos
    • Mejor soporte a la concurrencia
    • Optimización de los recursos del sistema

 

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

HILOS VS PROCESOS

Tienen características comunes pero...

¿Son lo mismo?

 

PROCESO

Es un programa ejecutándose de forma independiente y con un espacio propio de memoria.

Hilo

Flujo secuencial simple dentro de un proceso.

 

Chrome

 

                        PESTAÑAS

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

Un proceso puede estar formado

por múltiples hilos

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

  • Los procesos son las unidades básicas de ejecución en la programación concurrente
  • Representan un flujo de control en ejecución
  • En el contexto de un Sistema Operativo  
    • Un proceso es un programa que está siendo ejecutado 
    • Proceso = programa + datos + recursos

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

  • Un hilo es un flujo secuencial de ejecución independiente dentro de un programa
  • Todo programa tiene al menos un hilo
  • Un programa con más de un hilo es un programa multihilo
  • Todos los hilos comparten el procesador (si solo hay uno)
  • El SO decide cuándo cada hilo consigue la CPU
    • scheduling (planificación de hilos)
  • La programación multihilo puede ser complicada sobre todo cuando se requiere sincronización entre hilos 

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

  • Cuando se inicia un programa en Java
    • la máquina virtual crea un hilo principal
    • este hilo se encarga de invocar al método main() de la clase que se comience a ejecutar
    • el hilo termina cuando finaliza el método main()
    • si el hilo principal crea otros hilos, éstos se ejecutan de forma concurrente
    • cuando no queda ningún hilo activo el programa termina
  • Todos los hilos se ejecutan en la misma máquina virtual (mismo proceso)

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

UT 1: HILOS Y PROCESOS

Planificador de hilos

eugeniaperez.es

  • Habitualmente hay más hilos que CPU
  • El Thread Scheduler es el responsable de asignar la CPU de alguna manera entre todos los hilos que compiten por ella
  • Es parte del SO
  • Los SO asignan a cada hilo una pequeña cantidad de tiempo de procesador llamada quantum o time slice. Cuando este tiempo termina el hilo deja de ejecutarse y el SO asigna a otro hilo nuevamente tiempo de procesador
  • En los SO modernos se utiliza preemtive scheduling

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

Cuando el planificador quiere dar tiempo de CPU a un proceso distinto al que está en ejecución, se produce un cambio de contexto
               Coste computacional elevado

 

Solución -> hilos

  • Cambio de contexto más eficiente debido a que los hilos de un mismo proceso comparten recursos

 

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

Pero... ¿qué comparten y qué no?

 

 

UT 1: HILOS Y PROCESOS

THE CODING LOVE

 

Java -> lenguaje multihilo

Añadimos complejidad...

  •  
  •  
  •  

eugeniaperez.es

p 1: HILOS Y PROCESOS

Aplicaciones de los hilos

eugeniaperez.es

  • Para mejorar el rendimiento de aplicaciones que hacen un uso extensivo de operaciones de IO
  • Para mejorar la respuesta de las aplicaciones con interfaz gráfico
    • una aplicación con GUI puede quedar “congelada”...
  • Para atender las peticiones de dos o más clientes simultáneamente en aplicaciones basadas en servidor
    • servidor web, un chat
  • Para efectuar animaciones

¿APLICACIONES DE LOS HILOS?

UT 1: HILOS Y PROCESOS

Ejercicios

 

  • Dudas en el ejercicio 4 (flujos de texto)
  • Corrección de la entrega II
  • Lee y realiza las tareas finales de la página de Procesos
  • Solo si te da tiempo... Realiza el ejercicio 6
  •  
  •  
  •  

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

  • HILOS Y PROCESOS
    • INTRODUCCIÓN
    • ESTADOS DE UN PROCESO
    • SIMILITUDES Y DIFERENCIAS
    • CONCEPTOS BÁSICOS DE HILOS
    • LA CLASE THREAD
    • INTERCALACIÓN DE TAREAS
    • PRIMER PROGRAMA CON HILOS
    • TÉCNICAS DE PROGRAMACIÓN

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

Text

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

¿daemon ...?

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

  • HILOS Y PROCESOS
    • INTRODUCCIÓN
    • ESTADOS DE UN PROCESO
    • SIMILITUDES Y DIFERENCIAS
    • CONCEPTOS BÁSICOS DE HILOS
    • LA CLASE THREAD
    • INTERCALACIÓN DE TAREAS
    • PRIMER PROGRAMA CON HILOS
    • TÉCNICAS DE PROGRAMACIÓN

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

SIMILITUDES

  • Pueden estar sólo en un estado a la vez (principalmente ejecutando, listo y bloqueado).
  • Comparten la CPU y sólo un hilo puede estar activo a la vez.
  • Cuando se ejecutan cada uno tiene su propio contador de programa, pila y registros.
  • Pueden crear otros hilos hijos.

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

DIFERENCIAS

  •  Los hilos no son independientes unos de otros, pueden acceder a cualquier variable dentro del proceso.
  • Un hilo puede leer o escribir sobre las stacks (pilas) de los otros.
  • No existe una jerarquía, ya que todos pertenecen al mismo pool y un hijo puede sobrevivir al padre.

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

VETE A GIT > CLONE, BUSCA LA URL DE LOS PROYECTOS EN BITBUCKET:

  • PSP.UT1.LiftOff
  • PSP.UT1.LiftOffThread
  • PSP.UT1.MessagePrinter
  • PSP.UT1.MessagePrinterSleep

INTRODUCE LAS CREDENCIALES EN NETBEANS:

usuario: cuatrovientos

password: Cuatrovientos

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

  • HILOS Y PROCESOS
    • INTRODUCCIÓN
    • ESTADOS DE UN PROCESO
    • SIMILITUDES Y DIFERENCIAS
    • CONCEPTOS BÁSICOS DE HILOS
    • LA CLASE THREAD
    • INTERCALACIÓN DE TAREAS
    • PRIMER PROGRAMA CON HILOS
    • TÉCNICAS DE PROGRAMACIÓN

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

  •  Un hilo ejecuta una tarea.
  • Una forma de implementar TAREAS lo anterior es a través de la interfaz Runnable.
  • También se debe escribir un método run() para hacer que la tarea realice su trabajo.
  • Por lo tanto, una tarea es cualquier objeto que realiza una acción... Pero en este caso debe cumplir que implemente el método run().

 

UT 1: HILOS Y PROCESOS

REPASO...

eugeniaperez.es

INTERFACES EN JAVA

Cuando se implementa una interfaz, estamos obligados a implementar todos los métodos de la interfaz o hacerlos abstractos. 

Si tienes dudas sobre interfaces...

Repasa el ejemplo que hay subido al aula: Interfaces

 

 

UT 1: HILOS Y PROCESOS

UT1. Hilos y procesos en Java

eugeniaperez.es

tarea en java:

 

 

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

UT1. Proyecto 1.5 - LiftOff

  • Desde el main() se crea un hilo y se invoca a su run().
  • El método run() es el que contiene la tarea a ejecutar: una cuenta atrás antes de un lanzamiento.
  • En el run() normalmente se itera en bucle infinito o bien se establece una condición de salida.
  • Thread.yield() es útil para que el planificador cambie de contexto.

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

  • HILOS Y PROCESOS
    • INTRODUCCIÓN
    • ESTADOS DE UN PROCESO
    • SIMILITUDES Y DIFERENCIAS
    • CONCEPTOS BÁSICOS DE HILOS
    • LA CLASE THREAD
    • INTERCALACIÓN DE TAREAS
    • PRIMER PROGRAMA CON HILOS
    • TÉCNICAS DE PROGRAMACIÓN

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

  • La forma tradicional de manejar hilos en Java es a través de la clase Thread().
  • Esta clase recibe un objeto que implementa la interfaz Runnable.
  • Al invocar al método start() de la clase Thread() se inicializa.
  • Desde el propio método start() se invoca al run() sin que nosotros hagamos nada.

 

UT 1: HILOS Y PROCESOS

UT1. Hilos y procesos en Java

eugeniaperez.es

HILO en java:

 

 

 

UT 1: HILOS Y PROCESOS

REPASO...

eugeniaperez.es

Text

Thread t = new Thread(new LiftOff()); 
t.start();

Creación de hilos en Java:

El objeto que recibe Thread debe

implementar Runnable y definir

su tarea en el run().

public class LiftOff implements Runnable { 


...

public void run() { 
  while (countDown-- > 0) { 
      System.out.println(status()); 
      Thread.yield(); 
  } 
} 

...
}

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

UT1. Proyecto 1.6 - LiftOffThread

  • ¿Por qué vemos primero “Waiting for LiftOff”?
  • Veras la salida entremezclada y un resultado diferente cada vez que lo ejecutes...

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

  • HILOS Y PROCESOS
    • INTRODUCCIÓN
    • ESTADOS DE UN PROCESO
    • SIMILITUDES Y DIFERENCIAS
    • CONCEPTOS BÁSICOS DE HILOS
    • LA CLASE THREAD
    • INTERCALACIÓN DE TAREAS
    • PRIMER PROGRAMA CON HILOS
    • TÉCNICAS DE PROGRAMACIÓN

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

UT1. Proyecto 1.7 - MessagePrinter

  • Creamos varios hilos y los lanzamos con la intención de ejemplificar la intercalación de tareas...
  • ¿Qué sucede...?

UT1. Proyecto 1.8 - MessagePrinterSleep

  • Al añadir lógica más compleja (dormir al hilo 2 seg.) el planificador sí aprovecha para ir ejecutando la siguiente. Thread.sleep( mseg )

 

UT 1: HILOS Y PROCESOS

THE CODING LOVE

2 hilos compiten por la cpu....

Uno aprovecha que el otro

se duerme para su ejecución...

Thread.sleep(mseg)

 

  •  
  •  

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

UT1. Proyecto 1.8 - MessagePrinterSleep

  • ¿Cuál es el tiempo total de ejecución?
  • ¿Ha habido alguna mejora con respecto a una ejecución secuencial...?

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

  • HILOS Y PROCESOS
    • INTRODUCCIÓN
    • ESTADOS DE UN PROCESO
    • SIMILITUDES Y DIFERENCIAS
    • CONCEPTOS BÁSICOS DE HILOS
    • LA CLASE THREAD
    • INTERCALACIÓN DE TAREAS
    • PRIMER PROGRAMA CON HILOS
    • TÉCNICAS DE PROGRAMACIÓN

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

PSP.UT1.ThreadTest - ThreadTest

  • Copia el proyecto en tu IDE y analízalo.
  • Ejecútalo 
  • ENTREGA DE ACTIVIDAD 1 (pág. 47)
    • Domingo 27 Septiembre

 

A)

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

PSP.UT1.ThreadTestRunnable:

https://eugenia_perez@bitbucket.org/eugenia_perez/psp.ut1.threadtestrunnable.git

El Thread se crea "desde fuera" y la clase que recibe, SubprocessPrinter tiene que implementar Runnable.

 

b)

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

  • Java es un lenguaje que no soporta la herencia múltiple,
  • como si lo hace alguno de sus antecesores: C++
  • La herencia es un mecanismo que hay que utilizar con cautela
  • La opción B) no ocupa el lugar de la herencia. Si el día de mañana quisiéramos hacer uso de ella, por ejemplo para heredar de la clase Applet, no habría problema...

eugeniaperez.es

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

PSP.UT1.ThreadTestDecorator

https://eugenia_perez@bitbucket.org/eugenia_perez/psp.ut1.threadtestrunnable.git

De esta forma la clase SubprocessPrinter implementa Runnable y, a su vez, contiene un Thread.

Se corresponde con un patrón de diseño llamado Decorator.

eugeniaperez.es

c)

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

COMO CURIOSIDAD... PATRÓN DE DISEÑO DECORATOR

  • ¿Qué es un patrón de diseño...?
    • Una buena práctica de programación...
  • Decorator: patrón de diseño que sirve para añadir funcionalidad a clases ya existentes, quedándonos con lo que necesitemos y dando una implementación a lo que nos interesa (decorando...)

 

UT 1: HILOS Y PROCESOS

UT1. Hilos y procesos en Java

eugeniaperez.es

Text

A)

B)

C)

UT 1: HILOS Y PROCESOS

UT1. Hilos y procesos en Java

eugeniaperez.es

VENTAJAS DE LA TERCERA OPCIÓN

  • La clase SubprocessPrinter no ocupa el puesto de la herencia.
  • La clase que la utiliza (main o "cliente") no necesita conocer a SubprocessPrinter, solo crearlo.
  • Lo anterior implica que la clase SubprocessPrinter es autónoma para ser ejecutada como un hilo que ejecuta una tarea en Java. Contiene el start().

UT 1: HILOS Y PROCESOS

UT1. Hilos y procesos en Java

TERCERA OPCIÓN

 /**
     * Name of the thread
     */
    private Thread thread;

    /**
     * Assign a name to the subprocess calling the superclass constructor.
     *
     * @param name Name of the thread
     */
    public SubprocessPrinter(String name) {
        // select the sleeping time between 0 and 5 seconds
        sleepingTime = (int) (Math.random() * 5000);
        thread = new Thread(this, name);
        thread.start();
    }

UT 1: HILOS Y PROCESOS

UT1. Hilos y procesos en Java

TERCERA OPCIÓN

 thread = new Thread(this, name);
 thread.start();

La clase Thread tiene hasta 8 constructores. Si queremos que se ejecute nuestra tarea (la definida en el hilo) y no el run de la propia clase Thread, debemos construirlo con dicho objeto, que implementa Runnable, y, por tanto, define su tarea en su método run.

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

  • HILOS Y PROCESOS
    • INTRODUCCIÓN
    • ESTADOS DE UN PROCESO
    • SIMILITUDES Y DIFERENCIAS
    • CONCEPTOS BÁSICOS DE HILOS
    • LA CLASE THREAD
    • INTERCALACIÓN DE TAREAS
    • PRIMER PROGRAMA CON HILOS
    • TÉCNICAS DE PROGRAMACIÓN

eugeniaperez.es

UT 1: HILOS Y PROCESOS

REPASO

eugeniaperez.es

Ejecución de un hilo

  • Clase Thread ( Runnable
  • La tarea se define en el run()
  • El hilo se "prepara" mediante el start()
  • El start() está declarado en la clase base Thread y se encarga de llamar automáticamente al método run(), cuando el planificador estima que es un buen momento...

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

Ejecución en paralelo

  • Beneficio:
    • mayor rendimiento
    • reducción de tiempo de ejecución. Uso de CPU
  • Proceso A -> 10 s
  • Proceso B -> 9 s
    • Ejecución en serie -> 19 s
    • Ejecución en paralelo -> t < 19 s

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

Ejecución secuencial vs. en paralelo

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

UT1 - Proyecto 1.9: PSP.UT1.Race:

https://eugenia_perez@bitbucket.org/eugenia_perez/psp.ut1.race.git

  • Enfoque secuencial

UT1 - Proyecto 1.9: PSP.UT1.ConcurrentRace

https://eugenia_perez@bitbucket.org/eugenia_perez/psp.ut1.concurrentrace.git

  • Enfoque ejecución paralela

 

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

Realiza las actividades de la pág. 47:

  • Actividad 3 -> ejecución secuencial vs. paralela
  • Actividad 4 -> 
    • PSP.UT1.Activity4
    • https://eugenia_perez@bitbucket.org/eugenia_perez/psp.ut1.activity4.git
  • Actividad 5 ->
    • PSP.UT1.Activity5
    • https://eugenia_perez@bitbucket.org/eugenia_perez/psp.ut1.activity5.git

 

 

UT 1: HILOS Y PROCESOS

1.1 Hilos y procesos en Java

eugeniaperez.es

ENTREGA: 3 Octubre 23:30

  • Actividad 3 
  • Actividad 5 

Súbela al aula -> Actividad 3, 5

  • Realiza el test T.UT1