Programación concurrente Hebras

Documentos relacionados
dit Programación concurrente Sincronización condicional UPM

dit UPM Tema 2: Concurrencia /threads (java) Análisis y diseño de software José A. Mañas

Guillermo Román Díez

Ejecución de hebras. En realidad, todas las aplicaciones escritas en Java son aplicaciones multihebra (recuerde el recolector de basura).

Laboratorio I Java Threads (Silberschatz Galvin)

Arquitecturas cliente/servidor

Tema 6. Threads: programas multitarea

Programación concurrente en Java

Tema 12: Programación multihilo

dit UPM Tema 3: Concurrencia /threads (python) Análisis y diseño de software José A. Mañas

Programación Orientada a Eventos

Threads o Hilos. Un thread en JAVA comienza como una instancia de java.lang.thread antes de convertirse en un hilo de ejecución.

HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA

Programación Concurrente en Java: Threads. Ejemplos de programación concurrente. Luis Fernando Llana Díaz. 24 de abril de 2008

Programación concurrente en Java. Breve introducción. Miguel Ángel LATRE Dept. de Informática e Ingeniería de Sistemas

Parte I: Programación en un lenguaje orientado a objetos

Programación concurrente

Práctica #5: Uso de control de flujo, Excepciones y Lectura Estándar

Procesamiento paralelo con hilos de Java

TEMA 5: Control de la Concurrencia en Java (API Estándar)

EXCLUSIÓN MUTUA ENTRE HILOS. TEMA 5: Control de la Concurrencia en Java (API Estándar) Sintaxis para Bloques de Código Sincronizado

Programación Concurrente en Java: Threads

Guía práctica de estudio 12: Hilos

Multitarea en Java. Rafa Caballero - UCM

Programación Concurrente en Java

Java y JVM: programación concurrente. Adolfo López Díaz

2. Indica cuál de las siguientes afirmaciones es cierta:

PROGRAMACIÓN EN JAVA. { una línea para definir, crear o ejecutar ; }

PROGRAMACION CONCURRENTE

Si bien hay gran cantidad de excepciones, todas derivan de la clase Exception, además de las excepciones ya manejadas, se pueden crear propias.

Concurrencia en Android LSUB, GYSC, URJC

Federico Peinado

Examen parcial Convocatoria de junio de 2005 FUNDAMENTOS DE LA PROGRAMACIÓN

Java Threads. Sistemas Distribuidos Rodrigo Santamaría

1. Fundamentos. Existen dos tipos distintos de multitarea: BASADA EN PROCESOS

Diseño de tipos Igualdad, representación, código, copia y relación de orden

Multienhebrado en Java Un toque de sincronización Transporte en Java Ejemplo conjunto

Introducción a los Threads Java

Tema 4. Control de flujo. Programación Programación - Tema 4: Control de Flujo

Depto. Ingeniería de Sistemas Telemáticos Universidad Politécnica de Madrid ETSI Telecomunicación Fundamentos de Programación 15 de diciembre de 2011

Apuntes de Java. Tema 10: Threads. Uploaded by Ingteleco

MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar

PROGRAMACIÓN ORIENTADA A OBJETOS 1/7/2009. Examen de Java. Nombre: DNI: Titulación:

Natalia Partera Jaime Alumna colaboradora de la asignatura

Tema 2: Aplicaciones Multihilo, Cliente Servidor

Tema 4: Control del flujo de ejecución: Excepciones y Threads. Programación Orientada a Objetos. Marcos López Sanz

Estructura de datos y Programación

Ejemplo. class SiNoThread extends Thread { private String SiNo; static int Contador = 0; public SiNoThread(String s) { super(); SiNo = s; }

Práctica #0. Factoriales con Threads en Java. Pepper Pots (A ), Anthony Stark (A ) 18 de enero, 2017.

CAPÍTULO 3. PROCESOS VS. HILOS

Unidad IV: Programación concurrente (MultiHilos) 4.1. Concepto de hilo

Excepciones. Excepciones

Concurrencia en Java

Código Fuente. Creamos en C:\ una carpeta para ubicar el código fuente del servidor. En mi caso, he creado una carpeta denominada rmi4

Práctica No. 2. Tipos de Datos y Entrada/Salida Estándar

Threads. La plataforma JAVA soporta programas multhreading a través del lenguaje, de librerías y del sistema de ejecución. Dos.

Java RMI. Sistemas distribuidos

Concurrencia en Android LSUB, GYSC, URJC

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Programación concurrente y semáforos en Java

Procesamiento distribuido en Java

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

Colas. 5.1 Implementación

Conceptos Básicos de Concurrencia en Java

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Revisión del Concepto de Hilo (Thread) API Java parathreads: Marco General. Clase Thread: API Básica. TEMA 3: Creación y Control De Threads en Java

Hebras y Sincronización en Java

UNIDAD III.- Programación Concurrente

Programación Concurrente con Java

PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:

Estructuras de control selectivas

BENEMERITA UNIVERSIDAD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN LICENCIATURA EN CIENCIAS DE LA COMPUTACIÓN

JAVA 1. Introducción

Java: Programación Multithread

Fundamentos de los Sistemas Operativos. Tema 2. Procesos José Miguel Santos Alexis Quesada Francisco Santana

PROGRAMACION CONCURRENTE Y DISTRIBUIDA. IV.3 Monitorización de excepciones en Threads

LABORATORIO 4: CONCURRENCIA Juan Antonio de la Puente - 21/10/15

CAPÍTULO 2. PROCESOS VS. HILOS

Tema III. Multihilo. Desarrollo de Aplicaciones para Internet Curso 12 13

Manejo de Excepciones

Concurso: Cuánto sabes de JAVA?

Clases abstractas e interfaces en Java

CAPÍTULO III: Programación Concurrente en JAVA I: Programación con hilos

Excepciones y E/S Java y Servicios Web I Master en Ingeniería Matemática

CURSO : ESTRUCTURA DE DATOS DOCENTE : ING. JUAN ZEVALLOS VALLE

Java RMI Remote Method Invocation. Invocación Remota de Métodos en Java

Transcripción:

20151021 dit UPM Programación concurrente Hebras Juan Antonio de la Puente <jpuente@dit.upm.es> Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual 3.0 Unported. hbp://crea9vecommons.org/licenses/by-nc-sa/3.0/deed.es

Referencias Scott Oaks & Henry Wong Java Threads O'Reilly Media; 3rd ed (2004) Kathy Sierra & Bert Bates Head First Java, ch. 15 O'Reilly Media; 2nd ed (2005) Mordechai Ben-Ari Principles of Concurrent and Distributed Programming Addison-Wesley; 2nd ed (2006) 2

Programas concurrentes

Programas secuenciales y concurrentes Los programa que hemos visto hasta ahora son programas secuenciales ejecutan una operación detrás de otra (en secuencia) - aunque el orden puede variar (alternativas, bucles, etc). sólo hacen una cosa a la vez - sólo hay un flujo de ejecución A veces necesitamos que un programa haga varias cosas al mismo tiempo varias tareas o actividades que progresan en paralelo - en Java se llaman threads o hebras Estos programas se llaman programas concurrentes tienen varios flujos de ejecución - cada uno de ellos ejecuta una secuencia de operaciones 4

Ejecución concurrente y hebras programa secuencial programa concurrente hebra hebra hebra operación operación operación operación operación operación operación operación operación operación operación operación............ 5

Cómo funciona? En un sistema con varios procesadores se puede ejecutar cada tarea en un procesador ejecución simultánea (paralelismo físico) T1 T2 operación operación operación operación operación operación operación operación operación operación t En un monoprocesador se intercalan las operaciones de las tareas multiplexado en tiempo (paralelismo lógico) T1, T2 operación operación operación operación operación t La máquina virtual (o el sistema operativo) se encarga de los detalles Desde un punto de vista lógico son equivalentes 6

Aplicaciones Interfaces de usuario reactivas atención a sucesos asíncronos gestión de ventanas, widgets, etc. Servidores atención a múltiples clientes gestión de protocolos de comunicación Mejoras de prestaciones ejecución en multiprocesadores Cálculos complejos ejecución de algoritmos en paralelo 7

Ejemplo Programa con dos actividades: escribir la hora cada 1 s emitir un sonido cuando se pulsa la tecla intro Sería muy complicado hacerlo con un programa secuencial la tecla se puede pulsar en cualquier momento - es un suceso asíncrono - difícil de mezclar con la escritura de la hora Mejor con dos hebras programa hora espera 1 s escribe hora sonido espera tecla emite sonido 8

Ejemplo (continuación) /* hora */ while(true) { sleep(1000); System.out.println( new Date().toString()); /* linea */ while(true) { nextline(); beep(); Veremos el programa completo más adelante 9

Hebras (threads) en Java

Threads en Java En Java las actividades concurrentes se llaman threads (hebras, hilos) Se crean extendiendo la clase Thread class Tarea extends Thread { @Override public void run() { // código concurrente Tarea t = new Tarea(); Es obligatorio redefinir el método run() - contiene el código que se ejecuta concurrentemente con otras hebras ADSW Concurrencia 11

Arrancar una hebra Hay que arrancar la ejecución de cada hebra para que empiece a ejecutarse método start() Ejemplo Tarea t = new Tarea(); // se crea la hebra t... t.start(); // se empieza a ejecutar ahora se ejecutan a la vez el método t.run() y el método main() ADSW Concurrencia 12

Hebras en un programa Cuántas hebras hay en un programa? una hebra inicial que ejecuta el método main() todas las que se arranquen en el programa con start() la máquina virtual y la interfaz gráfica pueden crear hebras adicionales 13

Terminación de hebras y programas Una hebra termina cuando termina el método run() o cuando se fuerza su terminación mediante una interrupción - lo veremos más tarde Un programa termina cuando terminan todas sus hebras cuando termina main() y todas las demás hebras que hayan arrancado en el programa El programa también termina si se hace exit() desde alguna hebra se lanza una excepción que se propaga fuera de run() o main() 14

Estados de las hebras preempt nueva start t.start(); lista dispatch en ejecución Thread t = new Tarea(); resume end run suspend bloqueada 15

Ejemplo: Hora import java.util.*; public class Hora extends Thread { @Override public void run() { /* código concurrente */ try { while (true) { sleep(1000); /* esperar 1000 ms */ System.out.println(new Date().toString()); catch (InterruptedException e) { return; /* terminar esta hebra */ 16

Ejemplo: Sonido import java.awt.toolkit; import java.util.scanner; public class Sonido extends Thread { @Override public void run() { /* código concurrente */ Scanner sc = new Scanner(System.in); while(true) { sc.nextline(); Toolkit.getDefaultToolkit().beep(); 17

Ejemplo: Reloj public class Reloj { public static void main(string[] args) { Hora hora = new Hora () ; Sonido sonido = new Sonido(); hora.start(); sonido.start(); 18

Ejercicio Creación y activación de hebras Importar el proyecto Threads del repositorio https://github.com/aled-upm/tema3 Ejecutar el programa Reloj Añadir una hebra que escriba Hola en el terminal cada 5 s, y volver a ejecutar el programa con esta modificación 19

Otras formas de crear hebras

La clase java.lang.thread public class Thread implements Runnable { /* constructores */ public Thread(); public Thread(Runnable target); /* código concurrente */ void run(); /* arrancar la ejecución */ void start(); /* suspender la ejecución durante un tiempo */ static native void sleep(long millis) throws InterruptedException; /* esperar que termine la hebra */ void join() throws InterruptedException; /* interrumpir la ejecución de la hebra */ public void interrupt() throws SecurityException;... 21

La interfaz Runnable Java sólo admite herencia simple si se hereda de Thread no se puede heredar de otra clase java.lang.runnable es una interfaz que incluye el método run permite crear hebras sin heredar de Thread public interface Runnable { public void run (); class Actividad implements Runnable { public void run() { Thread t = new Thread(new Actividad()); 22

Ejemplo: Hora2 import java.util.*; public class Hora2 implements Runnable { public void run() { try { while (true) { Thread.sleep(1000); System.out.println(new Date().toString()); catch (InterruptedException e) { return; 23

Ejemplo: Reloj2 public class Reloj2 { public static void main(string[] args) { Runnable escribehora = new Hora2(); /* no es un thread */ Thread hora = new Thread(escribeHora); hora.start(); /* ahora sí */... 24

Objetos Runnable internos public class Reloj3 { public static void main(string[] args) { Runnable escribehora = new Runnable () { public void run() {... ; new Thread(escribeHora).start();... El método run queda oculto no se puede invocar desde fuera 25

Método run interno con Thread public class Reloj4 { public static void main(string[] args) { Thread hora = new Thread () { public void run() {... ; hora.start();... Otra forma de declarar el método run para que quede oculto 26

Más compacto todavía public class Reloj5 { public static void main(string[] args) { new Thread () { public void run() {....start();... 27

Interrupciones

Método interrupt Método de la clase Thread Uso habitual: despertar asíncronamente a una hebra bloqueada Si la hebra está bloqueada en un wait, join o sleep, se eleva la excepción InterruptedException Incluir la sentencia de bloqueo un bloque try/catch Indicar que el método puede elevar InterruptedException Si la hebra está haciendo otra cosa, se cambia un indicador consultar con interrupted() Si la hebra está bloqueada en otras operaciones, la excepción que se eleva es diferente Ej. bloqueo en operación de E/S 29

Ejemplo: Segundero public class Segundero extends Thread { public void run() { int segundos = 0; try { while (true) { sleep(1000); // La hebra se bloquea un segundo segundos++; System.out.println( Segundos: + segundos); catch (InterruptedException e) { System.err.println( Hebra interrumpida ); return; // La hebra ha sido desbloqueada mediante la // invocación de interrupt 30

Ejemplo: Temporizador import java.util.*; public class Temporizador { public static void main (String args[]) { // Segundos de espera hasta terminar int tiempoespera = 2; Segundero segundero = new Segundero(); segundero.start(); try { Thread.sleep(tiempoEspera * 1000); segundero.interrupt(); // Fin de la espera catch (Exception e) { System.err.println("Error esperando "); 31

Detener una hebra Lanzar una interrupción no es una buena forma de detener la ejecución Mejor algo así: public class Segundero extends Thread { private boolean activo = true; public void run() { while (activo) {... public void detener() { activo = false; 32

Problemas La hebra que llama a detener() es distinta que la que ejecuta run() por ejemplo, la hebra principal y la hebra segundero La variable activo se puede modificar mientras se está leyendo no es seguro que lo que lee segundero sea el valor correcto muchos problemas, los veremos en detalle de momento, la solución es declarar que activo es volátil private volatile boolean activo = true; Lo estudiaremos a fondo más adelante 33

Ejercicio Detener la ejecución de una hebra Modificar las clases Segundero y Temporizador para detener la cuenta de segundos mediante una variable, como en los ejemplos anteriores Tiene sentido mantener el manejador de InterruptedException en Segundero? Por qué? 34

Propiedades de los programas concurrentes

Propiedades de los programas Corrección (correctness) el resultado es correcto Seguridad (safety) nunca pasará nada malo Vivacidad (liveness) en algún momento se hará lo que se tiene que hacer Equidad (fairness) todas las hebras tienen la posibilidad de avanzar 36

Pruebas Algunas propiedades son difíciles de probar A veces se puede hacer con matemáticas como demostraciones de teoremas examinando todas las secuencias de ejecución posibles Es necesario poner mucha atención al escribir el programa para estar seguros de que es correcto 37

Resumen

Resumen Los programas concurrentes tienen varias hebras de ejecución (threads) que avanzan a la vez En Java las hebras son objetos de una clase que extiende Thread que implementa Runnable El método run() determina qué hace la hebra Para arrancar una hebra t se hace t.start() Una hebra termina cuando se llega al final de run() también por interrupciones Un programa termina cuando terminan todas sus hebras también la hebra inicial que ejecuta main() 39

Ejemplos Código en github https://github.com/aled-upm/tema3.git 40