Programación concurrente

Documentos relacionados
Concurrencia en Android LSUB, GYSC, URJC

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

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

Java nos ofrece la clase Thread y la interfaz Runable que permiten que varios procesos estén funcionando de forma concurrente.

Hebras y Sincronización en Java

1 HILOS (THREADS) EN JAVA

Federico Peinado

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Multitarea en Java. Rafa Caballero - UCM

(THREADS) Ing. Laura Sandoval Montaño, Ing. Manuel Enrique Castañeda Castañeda PAPIME

Java para programadores

Programación Concurrente en Java

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

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Java: Programación Multithread

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

Concurrencia en Java

Programación Orientada a Eventos

Java y JVM: programación concurrente

Concurrencia en Java

Multitarea En Swing. Varios hilos trabajadores, también conocidos como hilos en segundo plano.

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

Tema 4. Excepciones en Java

Programación Concurrente en Java

Benemérita Universidad Autónoma del Estado de Puebla

75-62 Técnicas de Programación Concurrente II 2004 java Threads

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

Estructura de las Aplicaciones Orientadas a Objetos El patrón Modelo-Vista-Controlador (MVC)

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

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

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

- Compilar y ejecutar programas en Java - Estructura básica de una clase - El comando javac - El comando java - Introducción al IDE de desarrollo

Java Avanzado Facultad de Ingeniería. Escuela de computación.

Monitores Ing. Iván Medrano Valencia

Hilos. Índice. Copyright Dept. Ciencia de la Computación e IA All rights reserved.

PROGRAMACION DISTRIBUIDA MobileTracker: Ejemplo de implementación con RMI

Sistemas Distribuidos Java RMI (Remote Method Invocation) Alberto Lafuente Mikel Larrea Dpto. ATC, UPV/EHU

APELLIDOS:... NOMBRE:... GRUPO:... NÚMERO DE EXPEDIENTE:...

Secretos de la Programación Concurrente

GUÍA DE TRABAJO GRADO 11. Articulación SENA Programación de Software Ing. Néstor Raúl Suarez Perpiñan Página 1 de 6

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

TEMA 6: API Java para Concurrencia de Alto Nivel

Introducción a los Sistemas Operativos

en otra máquina exactamente de la misma manera que si se encontrará en la misma máquina

PROGRAMACIÓN EN JAVA

Modulo 11. Clases y Objetos en Java

Programación Concurrente. Curso Java 2012, 2013 Juan Manuel Fernández Peña

Modelo de Objetos Distribuidos

Interfaces y Clases Internas. ELO329: Diseño y Programación Orientados a Objetos

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INGENIERÍA TELEMÁTICA. Daniel Díaz Sánchez

Clase 34. Hilos. Qué es un hilo?

Java en 2 horas. Rodrigo Santamaría

Interfaces gráficas con Swing

Introducción a la Programación Orientada a Objetos

Elementos léxicos del lenguaje de programación Java

1. Visión general de RMI

Object 1. Threads en Java

CONCURRENCIA EN JAVA. Diseño de Sistemas Operativos Avanzados 2000/2001. Pedro Pablo Gómez Martín

Java en 3 horas. Ampliación de Sistemas Operativos. Rodrigo Santamaría

Benemérita Universidad Autónoma del Estado de Puebla

1. Manejo de memoria estática 2. Manejo de memoria dinámica

FACULTAD DE INGENIERÍA

Ejemplo de GUI con Swing

INTRODUCCION A LA PROGRAMACION EN JAVA

Programación Orientada a Objetos. Java: Excepciones

Introduciendo datos desde el

Desarrollo de aplicaciones con JAVA, JCreator, JDeveloper NetBeans

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

Pruebas de unidad con JUnit

JAVA 7 Los fundamentos del lenguaje Java

Pruebas de unidad utilizando JUnit Juan Manuel Fernández Peña, 2005

En este capitulo se estudiarán los conceptos relacionados a métodos, como lo son sobrecarga, métodos estáticos.

Encapsulación: clases y objetos

Experto Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles. Sesión 1: Introducción al Lenguaje Java

2. Estructura de un programa en Java

Práctica 4: Java Remote Method Invocation (RMI)

Patrones de diseño. Patrón básico Handler. Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)

Programación Orientada a Objetos. Java: Excepciones

Práctica 2: Java Remote Method Invocation (RMI)

Repaso de las características más importantes de la programación Java y su adaptación a Android

James Gosling, creador de Java

Ejercicios de evaluación de fundamentos de programación en Java

ESCUELA SUPERIOR POLITECNICA DE CHIMBORAZO ESCUELA DE INGENIERIA EN SISTEMAS

Aplicaciones Java. Juan Manuel Fernández Peña Curso 2011, 2013

Si bien Pascal-FC no trae algunas de las características de Pascal como:

Programación multihebra

CONCEPTOS BASICOS DEL LENGUAJE JAVA

PROGRAMACION DISTRIBUIDA

Threads o Hilos. Marco Besteiro y Miguel Rodríguez

Introducción al lenguaje Java

Sistemas operativos. Hasta ahora hemos visto. Relación programa-sistema operativo Gestión de memoria

Arquitecturas cliente/servidor

INSTALACION Y PRUEBA DEL PLUGIN WindowBuilder para trabajar Swing en Eclipse

Otras formas de Sincronización en Java

Universidad ORT - Arquitectura de Software. Requisitos

Transcripción:

Programación concurrente Java y Servicios Web I Master en Ingeniería Matemática Manuel Montenegro Dpto. Sistemas Informáticos y Computación Desp. 467 (Mat) montenegro@fdi.ucm.es

Programación concurrente Consiste en la ejecución simultánea de varias tareas, que pueden interactuar entre sí. Paso de mensajes. Acceso a memoria compartida. Un hilo (thread) es una tarea (conjunto de instrucciones) que puede ejecutarse en paralelo con las demás. Estos hilos pueden ser todos ejecutados por un sólo procesador, o distribuidos entre los distintos procesadores. La asignación de hilos a procesadores es realizada por el sistema operativo. 2

Contenidos Operaciones con hilos Acceso a memoria compartida Condiciones de carrera Secciones críticas Multitarea con Swing 3

Creación de hilos Para crear un hilo, se deberá crear una clase que implemente la interfaz Runnable. public interface Runnable { void run(); La clase ha de tener un método run(), que realizará las acciones correspondientes. 4

Creación de hilos Para definir las acciones que se realizan en un hilo, se deberá crear una clase que implemente la interfaz Runnable. public interface Runnable { void run(); La clase ha de tener un método run(), que realizará las acciones correspondientes. 5

Ejemplo public class Enanito implements Runnable { private String nombre; public Enanito(String nombre) { this.nombre = nombre; public void run() { for (int contador = 1; contador <= 10; contador++) { System.out.printf("%s cuenta hasta %d\n", nombre, contador); System.out.printf("%s terminó\n", nombre); 6

Creación de hilos El método tradicional de creación de hilos consiste en crear una instancia de la clase Thread, y pasarle el objeto Runnable correspondiente mediante su constructor. A continuación se debe llamar al método start() del objeto thread correspondiente para iniciar su ejecución. 7

Ejemplo public class Test1 { public static void main(string[] args) { String[] nombres = {"Sabio", "Gruñón", "Mudito", "Dormilón", "Tímido", "Tontín", "Bonachón"; for (String nomb : nombres) { Enanito e = new Enanito(nomb); Thread t = new Thread(e); t.start(); 8

Ejemplo 9

Creación de hilos Desde la versión 5 de Java, no es necesario crear objetos de la clase Thread directamente. Existe un objeto ExecutorService (paquete java.util.concurrent) que recibe las tareas a ejecutar (objetos que implementan Runnable) y las distribuye en distintos hilos. Existen varios tipos de ExecutorService Implementan distintas políticas de distribución de tareas en hilos. Un ExecutorService no tiene constructor. Se crea mediante métodos estáticos contenidos en la clase Executors. 10

Ejemplo public class Test2 { public static void main(string[] args) { String[] nombres = {"Sabio", "Gruñón", "Mudito", "Dormilón", "Tímido", "Tontín", "Bonachón"; ExecutorService exec = Executors.newCachedThreadPool(); for (String n : nombres) { Enanito e = new Enanito(n); exec.execute(e); exec.shutdown(); No admitir más tareas en el Executor 11

CachedThreadPool Tipos de ExecutorService Genera tantos hilos como considere necesarios. Procura reciclar los hilos cuya tarea ha terminado. FixedThreadPool Crea, al inicio, una cantidad de hilos fija. SingleThreadExecutor Como un FixedThreadPool, pero con un único hilo. Si se envían varias tareas a un SingleThreadExecutor, se pondrán en cola. 12

Dormir un hilo public class Enanito implements Runnable { public void run() { for (int contador = 1; contador <= 10; contador++) { System.out.printf("%s cuenta hasta %d\n", nombre, contador); try { TimeUnit.SECONDS.sleep(1); catch (InterruptedException e) { System.out.println("Se ha interrumpido"); System.out.printf("%s terminó\n", nombre); Detener hilo 1 seg. 13

Prioridad de hilos public class Enanito implements Runnable { public void run() { if (nombre.equals("acaparadorcito")) { else { Thread.currentThread().setPriority(Thread.MAX_PRIORITY); Thread.currentThread().setPriority(Thread.MIN_PRIORITY); for (int contador = 1; contador <= 10; contador++) { System.out.printf("%s cuenta hasta %d\n", nombre, contador); System.out.printf("%s terminó\n", nombre); 14

Prioridad de hilos public class Test2 { public static void main(string[] args) { String[] nombres = {"Sabio", Acaparadorcito, "Gruñón", "Mudito", "Dormilón", "Tímido", "Tontín", "Bonachón"; ExecutorService exec = Executors.newCachedThreadPool(); for (String n : nombres) { Enanito e = new Enanito(n); exec.execute(e); exec.shutdown(); 15

Esperar la finalización de un hilo El método awaittermination de ExecutorService permite detener el hilo que ejecuta dicho método hasta que los hilos del servicio ejecutor terminen. Recibe como parámetro una cantidad de tiempo máximo a esperar, cuya unidad de medida es el segundo parámetro. Lanza una excepción InterruptedException si el la espera se interrumpe externamente. 16

Esperar la finalización de un hilo public class Test2 { public static void main(string[] args) { String[] nombres = {"Sabio", "Gruñón", "Mudito", "Dormilón", "Tímido", "Tontín", "Bonachón"; ExecutorService exec = Executors.newCachedThreadPool(); for (String n : nombres) { Enanito e = new Enanito(n); exec.execute(e); exec.shutdown(); try { exec.awaittermination(100, TimeUnit.SECONDS); System.out.println("Los siete enanitos han terminado"); catch(interruptedexception e) { System.out.println("Se interrumpió"); 17

Contenidos Operaciones con hilos Acceso a memoria compartida Condiciones de carrera Secciones críticas Multitarea con Swing 18

Acceso a memoria compartida Supongamos que ahora los hilos manipulan una zona de memoria común. public class Contador { private int valor; public Contador() { valor = 0; public void incrementar() { valor++; public int getvalor() { return valor; 19

Acceso a memoria compartida public class Enanito implements Runnable { private String nombre; private Contador contador; public Enanito(String nombre, Contador contador) { this.nombre = nombre; this.contador = contador; public void run() { for (int i = 0; i < 1000; i++) contador.incrementar(); Cada enanito incrementa el contador 1000 veces 20

Acceso a memoria compartida public class Test2 { public static void main(string[] args) { String[] nombres = {"Sabio", "Gruñón", "Mudito", "Dormilón", "Tímido", "Tontín", "Bonachón"; Contador c = new Contador(); ExecutorService exec = Executors.newCachedThreadPool(); for (String n : nombres) { Enanito e = new Enanito(n, c); exec.execute(e); exec.shutdown(); try { exec.awaittermination(100, TimeUnit.SECONDS); System.out.println("Los siete enanitos han terminado"); catch(interruptedexception e) { System.out.println("Se interrumpió"); Todos los enanitos incrementan el mismo contador System.out.printf("El valor final del contador es: %d\n", c.getvalor()); 21

Acceso a memoria compartida El valor final del contador debería ser 7000. Sin embargo: 22

Condiciones de carrera contador = 0 T2 T1 contador++ 23

Condiciones de carrera contador = 0 T2 T1 LOAD contador ADD 1 STORE contador 24

Condiciones de carrera Registro = 0 T2 T1 LOAD contador ADD 1 STORE contador contador = 0 25

Condiciones de carrera Registro = 1 T2 T1 LOAD contador ADD 1 STORE contador contador = 0 26

Condiciones de carrera Registro = 1 T2 T1 LOAD contador ADD 1 STORE contador contador = 1 27

Condiciones de carrera Registro = 1 T2 T1 LOAD contador ADD 1 STORE contador contador = 1 28

Condiciones de carrera Registro = 1 Registro = 1 T2 T1 LOAD contador ADD 1 STORE contador contador = 1 29

Condiciones de carrera Registro = 2 Registro = 1 T2 T1 LOAD contador ADD 1 STORE contador contador = 1 30

Condiciones de carrera Registro = 2 Registro = 1 T2 T1 LOAD contador ADD 1 STORE contador contador = 2 31

Condiciones de carrera contador = 2 OK Registro = 1 Registro = 2 T1 T2 LOAD contador ADD 1 STORE contador 32

Condiciones de carrera contador = 0 T2 T1 LOAD contador ADD 1 STORE contador 33

Condiciones de carrera Registro = 0 T2 T1 LOAD contador ADD 1 STORE contador contador = 0 34

Condiciones de carrera Registro = 1 T2 T1 LOAD contador ADD 1 STORE contador contador = 0 35

Condiciones de carrera Registro = 1 T2 T1 LOAD contador ADD 1 STORE contador contador = 0 36

Condiciones de carrera Registro = 0 Registro = 1 T2 T1 LOAD contador ADD 1 STORE contador contador = 0 37

Condiciones de carrera Registro = 1 T2 LOAD contador ADD 1 STORE contador contador = 1 38

Condiciones de carrera Registro = 1 Registro = 1 T1 T2 LOAD contador ADD 1 STORE contador contador = 1 39

Condiciones de carrera Registro = 1 Registro = 1 T1 T2 LOAD contador ADD 1 STORE contador contador = 1 40

Condiciones de carrera Registro = 1 Registro = 1 T1 T2 LOAD contador ADD 1 STORE contador contador = 1 41

Condiciones de carrera Registro = 1 Registro = 1 T1 T2 LOAD contador ADD 1 STORE contador contador = 1 42

Condiciones de carrera Registro = 1 Registro = 1 T1 T2 LOAD contador ADD 1 STORE contador contador = 1 43

Secciones críticas Idealmente, desearíamos que sólo un hilo pudiese ejecutar simultáneamente a determinadas regiones del programa exclusión mutua. LOAD contador ADD 1 STORE contador 44

Secciones críticas Java proporciona un mecanismo de exclusión mutua integrado en el lenguaje. Cada objeto tiene asociado un candado (lock, o monitor). Se utiliza la palabra synchronized para especificar zonas de exclusión mutua dentro del código. synchronized (objeto) { sentencias; 45

Secciones críticas synchronized (objeto) { sentencias; Cuando la ejecución de un hilo llega a un bloque synchronized, adquiere el candado del objeto correspondiente, y lo libera cuando abandona dicho bloque. Ningún otro hilo podrá entrar en el bloque synchronized hasta que el hilo poseedor del candado lo libere. 46

Ejemplo public class Enanito implements Runnable { public void run() { for (int i = 0; i < 1000; i++) { synchronized(contador) { contador.incrementar(); 47

Ejemplo public class Enanito implements Runnable { public void run() { for (int i = 0; i < 1000; i++) { synchronized(contador) { contador.incrementar(); 48

Solución alternativa Es aconsejable delimitar la zona de exclusión mutua en el código del propio contador, en lugar de en el código de los enanitos. public class Contador { private int valor; public Contador() { valor = 0; public void incrementar() { synchronized(this) { valor++; public int getvalor() { return valor; 49

Solución alternativa Es aconsejable delimitar la zona de exclusión mutua en el código del propio contador, en lugar de en el código de los enanitos. public class Contador { private int valor; public Contador() { valor = 0; public synchronized void incrementar() { valor++; public int getvalor() { return valor; 50

Contenidos Operaciones con hilos Acceso a memoria compartida Condiciones de carrera Secciones críticas Multitarea con Swing 51

Multitarea en Swing 52

Multitarea en Swing class GestorBotonOK implements ActionListener { public void actionperformed(actionevent e) { String entrada = jtextfield1.gettext(); if (entrada.isempty()) { JOptionPane.showMessageDialog(null, "No has introducido ningún número"); else { try { int n = Integer.parseInt(entrada); long result = fib(n); Cómputo largo jlabel3.settext(string.valueof(result)); catch (NumberFormatException exc) { JOptionPane.showMessageDialog(null, "Has de introducir un número"); public long fib(int n) { 53

Multitarea en Swing El cálculo del número de Fibonacci indicado se realiza desde el mismo hilo que se encarga de atender los eventos de la interfaz. Mientras se realiza el cómputo del número de Fibonacci indicado, la interfaz no responde. Es necesario realizar dicho cómputo en un hilo, en paralelo con la gestión de eventos de la interfaz. 54

Multitarea en Swing Hilo de Swing Llamar a actionperformed(..)... Atender a eventos del usuario Hilo nuevo Cálculo de Fibonacci.... Actualizar JLabel Los componentes de Swing no ofrecen acceso concurrente. Sólo se pueden modificar los componentes de Swing desde el hilo de Swing. 55

Multitarea en Swing Extendiendo la clase SwingWorker podemos crear tareas que se ejecuten en paralelo, y puedan modificar los componentes de la interfaz de manera segura. 56

Multitarea en Swing public class CalculadorFibonacci extends SwingWorker<Long, Object> { private int n; private JLabel resultado; public CalculadorFibonacci(int n, JLabel resultado) { this.n = n; this.resultado = resultado; public Long doinbackground() { return fib(n); protected void done() { try { Long res = get(); resultado.settext(res.tostring()); catch (InterruptedException e) { JOptionPane.showMessageDialog(null, "Interrumpido: " + e.getmessage()); catch (ExecutionException e) { JOptionPane.showMessageDialog(null, "Error de ejecución: " + e.getmessage()); private long fib(int n) { 57

Multitarea en Swing class GestorBotonOK implements ActionListener { public void actionperformed(actionevent e) { String entrada = jtextfield1.gettext(); if (entrada.isempty()) { JOptionPane.showMessageDialog(null, "No has introducido ningún número"); else { try { int n = Integer.parseInt(entrada); CalculadorFibonacci calc = new CalculadorFibonacci(n, jlabel3); calc.execute(); catch (NumberFormatException exc) { JOptionPane.showMessageDialog(null, "Has de introducir un número"); 58

Referencias P. Deitel, H. Deitel Java. How to Program (9th Edition) Caps. 26 B. Eckel Thinking in Java (3rd Edition) Cap. 13 Sincronización mediante paso de mensajes. http://mpj-express.org/ 59