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

Documentos relacionados
Programación Concurrente en Java: Threads

Programación Concurrente en Java

Tema 6. Threads: programas multitarea

dit Programación concurrente Sincronización condicional UPM

Programación concurrente en Java

UPM Concurrencia en Java

Laboratorio I Java Threads (Silberschatz Galvin)

Threads LSUB. 30 de marzo de 2016 GSYC

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

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

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

Tema 12: Programación multihilo

CAPÍTULO 3. PROCESOS VS. HILOS

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

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

Programación Orientada a Eventos

Programación concurrente Hebras

Procesamiento paralelo con hilos de Java

Arquitecturas cliente/servidor

Guillermo Román Díez

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

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

Universidad Autónoma de Baja California Facultad de Ingeniería Apuntes de Programación Orientada a Objetos I

Normalmente, los programas son ejecutados de forma secuencial. Único flujo de control

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

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

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

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

Java Threads. Sistemas Distribuidos Rodrigo Santamaría

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

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

Unidad 3 Sistemas con memoria común

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

Java RMI. las RPC de Java. Parte I. Luis Fernando Llana Díaz. Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid

HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA

Concurrencia en Android LSUB, GYSC, URJC

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

Prueba objetiva 2 - Clave b

UNIDAD III.- Programación Concurrente

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

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

Programación concurrente

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

Conceptos Básicos de Concurrencia en Java

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

Primitivas de Sincronización

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

Benemérita Universidad Autónoma del Estado de Puebla

Programación Concurrente con Java

Programación concurrente y semáforos en Java

Multitarea en Java. Rafa Caballero - UCM

Introducción a los Threads Java

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

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

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

Colas. 5.1 Implementación

Lenguajes de Programación Curso Práctica Hilos Extendiendo Thread Implementando Runnable... 1

PROGRAMACION CONCURRENTE

1 HILOS (THREADS) EN JAVA

Prueba final, parte 2 - Clave a Concurrencia Segundo semestre Universidad Politécnica de Madrid

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

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

ELO330: Programación de Sistemas: Certamen Final 8/11/2006 Certamen Final 100 minutos. Puede usar Apuntes. Todas las preguntas tienen igual puntaje.

Estructuras de control selectivas

Concurrencia Monitores. Guillermo Román Díez

Concurrencia en Java

Lenguaje de programación con JAVA

Cena de filosofos y sincronizacion java

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

CLAVE EXAMEN: a cd. c u r s o r = c u r s o r. g e t S i g u i e n t e ( ) ; p o s i c i o n ++;

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

Concurrencia en Java

Examen Teórico Convocatoria de Junio de 2012

CAPÍTULO 2. PROCESOS VS. HILOS

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

Federico Peinado

Java Optional ifpresent y como utilizarlo

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

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

Monitores Ing. Iván Medrano Valencia

Tema 2: Aplicaciones Multihilo, Cliente Servidor

Director: Tinetti,, Fernando

Excepciones. Excepciones

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

Examen concurrencia Nov 2011

Java: Programación Multithread

Soluciones al Examen de Fundamentos de Computadores y Lenguajes

Asignatura. Taller de Computación VI. Módulo VI Threads

Cuadernillo de ejercicios cortos Concurrencia. Curso

Concurrencia. Primitivas IPC con bloqueo

NUEVOS APIS DE PROGRAMACIÓN

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

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

Apellidos: Nombre: Matrícula:

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

2. Tratamiento de objetos con JAVA

/** * Raíz del árbol de contactos presentes en el directorio */ private. /** * Número de contactos en el directorio */ private int numcontactos;

Sincronización por Colas en en Java

Transcripción:

Departamento de Sistemas Informáticos y Computación Universidad Complutense de Madrid de abril de 00 Ejemplos de programación concurrente En un sistema operativo, diversos programas compiten por los recursos del sistema: memoria, dispositivos. Bases de datos. Aplicaciones Web.

Hebras, hilos En un programa concurrente puede haber varios hilos de computación. h h h Sincronización de Objetos Puede haber varias hebras ejecutando simultáneamente métodos de objetos Es necesario sincronizar los accesos al objeto.

Threads Extendiendo la clase java.lang.thread. public class PrThread extends Thread { public PrThread ( String s) { super (s); public final void run () { boolean sigue = true ; for ( int i =0; i <00 && sigue ; i ++) { System. out. println ( getname ()+ ":"+i); sleep (0); catch ( InterruptedException e) { System. out. println ( getname ()+ " interrumpida "); sigue = false ; public static final void main ( final String [] args ){ Thread p = new PrThread (" mia "); p. start (); 0 0 Threads Implementado el interfaz java.lang.runnable. public class PrRunnable implements Runnable { public final void run () { Thread hebra = Thread. currentthread (); boolean sigue = true ; for ( int i =0; i <00 && sigue ; i ++) { System. out. println ( hebra. getname ()+ ":"+i); hebra. sleep (0); catch ( InterruptedException e) { System. out. println ( hebra. getname ()+ " interrumpida "); sigue = false ; public static final void main ( final String [] args ) { Thread p = new Thread ( new PrRunnable ()," mia "); p. start (); 0

Ciclo de vida de una hebra running yield Nueva hebra Runnable Not runnable El metodo run finaliza Dead Se crea la hebra. La hebra está en ejecución. Se ejecuta el método start. La hebra se suspende: ha ejecutado sleep, join, wait. La hebra finaliza. El método run finaliza. Parar una hebra Usar el método interrupt public static void ex () throws InterruptedException { Thread h = new PrThread (""); h. start (); Thread. sleep (00); h. interrupt (); System. out. println (h. isinterrupted ()); Métodos Deprecated: stop, suspend, resume. Una hebra para cunado está Not Runnnable, ha ejecutado sleep, join, wait. Pueden lanzar InterruptedException, la hebra debería parar.

Esperamos a que una hebra acabe Método: join public static void ex () throws InterruptedException { Thread h = new PrThread (""); Thread h = new PrThread (""); Thread h = new PrThread (""); h. start (); h. start (); h. start (); h. join (); h. join (); h. join (); 0 Esperamos a que una hebra acabe Método: join h h h h.start(): h se ejecuta. h.start(): h se ejecuta. h.start(): h se ejecuta. h.join(): esperamos a que h pare. h.join(): esperamos a que h pare. h.join(): esperamos a que h pare (no hace falta).

Cerrojos de objetos Cada objeto en Java tiene un cerrojo synchronized ( obj ) { /* */ Sólo pueda haber una hebra propietaria del cerrojo. Sólo una hebra propietaria del cerrojo puede ejecutar un código synchronized. El cerrojo puede abarcar a todo un método type method (...) { synchronized ( this ) { /* */ synchronized type method (...) { /* */ Durmiéndose/depertándose en un objeto wait() Una hebra que tiene el cerrojo de un objeto puede invocar el método wait() del objeto. La hebra queda suspendida hasta que alguien la despierte. Se libera para que otra hebra pueda adquirirlo. Cuando es liberarla debe adquirir de nuevo el cerrojo para seguir la ejecución. wait(tiempo) Igual, pero se queda dormida un tiempo máximo. notify() Una hebra que tiene el cerrojo de un objeto puede invocar el método notify() del objeto. Despierta una hebra suspendida en el objeto. No libera el cerrojo del objeto. notifyall Igual, pero despierta a todas.

Regiones críticas El acceso a las regiones críticas debe ser exclusivo public void run () { boolean para = false ; while (! para ) { ciclo (); catch ( InterruptedException e) { para = true ; 0 private void ciclo () throws InterruptedException { monitor. entrar (); InterruptedException salir = null ; regcritica (); catch ( InterruptedException e) { salir =e; finally { monitor. salir (); if ( salir!=null ) { 0 throw salir ; int t = random. nextint ( tiempodentro ); sleep (t); Monitor regiones críticas public class Monitor { private int caben ; // caben >=0 public Monitor () { caben =; public synchronized void salir () { caben ++; notify (); public synchronized void entrar () throws InterruptedException { while ( caben ==0) wait (); caben - -; 0

Colecciones sincronizadas En la clase java.util.collections encontramos los siguientes métodos estáticos: public static <T> Collection <T> synchronizedcollection ( Collection <T> c) public static <T> Set <T> synchronizedset (Set <T> s) public static <T> SortedSet <T> synchronizedsortedset ( SortedSet <T> s) public static <T> List <T> synchronizedlist (List <T> list ) public static <K,V> Map <K,V> synchronizedmap (Map <K,V> m) public static <K,V> SortedMap <K,V> synchronizedsortedmap ( SortedMap <K,V> m) Lectores/Escritores I public void run () { monitor. permisoleer (); lee (); finally { monitor. finleer (); public void run () { monitor. permisoescribir (); escribe (); finally { monitor. finescribir ();

Lectores/Escritores II package simulacion. lectoresescritores ; public class Monitor { private int escresperando ; // núm escritores esperando private int numlect ; // núm lectores leyendo private int numescr ; // núm escritores escribiendo // escresperando >= numescr, 0<=numEscr <= numlect >=0, nunlect >0 ---> numescr =0 public Monitor () { escresperando =0; numlect =0; numescr =0; public synchronized void permisoleer () throws InterruptedException { while ( numescr >0 escresperando >0) wait (); numlect ++; public synchronized void finleer () { numlect - -; notifyall (); public synchronized void permisoescribir () throws InterruptedException { escresperando ++; while ( numlect >0) wait (); numescr ++; public synchronized void finescribir () { escresperando - -; numescr - -; 0 0 Lectores/Escritores III

Lectores/Escritores IV package simulacion. lectoresescritores ; import soporte. Aleatorio ; public class GeneradorLectores extends Thread { private double tmediollegada ; private int tleyendo ; private int tmaxsimulacion ; private Aleatorio aleatorio ; private Monitor monitor ; public GeneradorLectores ( double tllegada, int tleyendo, int tmax, int semilla, Monitor m){ tmediollegada = tllegada ; tleyendo = tleyendo ; tmaxsimulacion = tmax ; 0 aleatorio = new Aleatorio ( semilla ); monitor = m; public void run () { System. out. println (" Empezando la generación de lectores "); while ( true ) { int sigcoche = aleatorio. poisson ( tmediollegada ); this. sleep ( sigcoche *000); Lector lector = new Lector ( Simulador. sigusuario (), tleyendo, monitor ); 0 System. out. println (" Comenzando "+lector ); lector. start (); catch ( InterruptedException e ) { System. out. println (" Simulación lectores finalizada "); Lectores/Escritores V

Lectores/Escritores VI package simulacion. lectoresescritores ; class Simulador { private static int numusuario = -; private static long horainicio ; public synchronized static int sigusuario () { numusuario ++; return numusuario ; public Simulador ( double tllegadalect, double tllegadaescr, int tleyendo, int tescribiendo, int tmax ) throws InterruptedException { Monitor monitor = new Monitor (); GeneradorLectores generalectores = new GeneradorLectores ( tllegadalect, tleyendo, tmax,, monitor ); GeneradorEscritores generaescritores = new GeneradorEscritores ( tllegadaescr, tescribiendo, tmax,, monitor ); generalectores. start (); generaescritores. start (); horainicio = System. currenttimemillis (); Thread. sleep ( tmax *000); generalectores. interrupt (); generaescritores. interrupt (); generalectores. join (); generaescritores. join (); 0 0 Lectores/Escritores VII public static void main ( String [] args ) throws Exception { Simulador s = new Simulador (,,,, 0);

Filósofos I Filósofos II while ( true ) { piensa (); mesa. pidetenedores (); come (); mesa. cedetenedores (); { true filósofo i está comiendo comiendo[i] false filósofo i NO está comiendo INV comiendo[i] comiendo[i ] comiendo[i ]

Filósofos III public class Mesa { private int numfilosofos ; private boolean [] comiendo ; public Mesa ( int n) { numfilosofos = n;; comiendo = new boolean [ numfilosofos ]; for ( int i = 0; i < numfilosofos ; i ++) { comiendo [i] = false ; /* permisocomer ( int i) y cedepermiso ( int i) */ 0 Filósofos IV public synchronized void permisocomer ( int i) throws InterruptedException { while ( comiendo [ ant (i)] comiendo [ sig (i )]) { wait (); comiendo [i]= true ; public synchronized void cedepermiso ( int i) { comiendo [i]= false ; notifyall (); public int sig ( int i) { return (i +) % numfilosofos ; public int ant ( int i) { return ( i -+ numfilosofos ) % numfilosofos ; 0

Filósofos V public class Filosofo extends Thread { private Random random ; private int tiempocomiendo, tiempopensando ; private Mesa mesa ; private int id; public Filosofo ( Random r, int tc, int tp, Mesa m, int i) { random = r; tiempopensando = tp; tiempocomiendo = tc; mesa = m; id = i; public void run () { boolean para = false ; while (! para ) { ciclo (); catch ( InterruptedException e) { para = true ; 0 0 Filósofos VI private void ciclo () throws InterruptedException { piensa (id, tiempopensando ); mesa. permisocomer (id ); come (id, tiempocomiendo ); catch ( InterruptedException e) { mesa. cedepermiso (id ); throw e; mesa. cedepermiso (id ); private void espera ( int tiempo ) throws InterruptedException { int t = random. nextint ( tiempo ); sleep (t); private void piensa ( int id, int tiempo ) throws InterruptedException { System. out. println ("El filósofo "+id+" empieza a pensar "); espera ( tiempo ); System. out. println ("El filósofo "+id+" acaba de pensar "); private void come ( int id, int tiempo ) throws InterruptedException { System. out. println ("El filósofo "+id+" empieza a comer "+":"+ mesa ); espera ( tiempo ); System. out. println ("El filósofo "+id+" acaba de comer "+":"+ mesa ); 0 0

Filósofos VII Filósofos VIII public static void main ( String [] args ) throws InterruptedException { int numfilosofos = ; int tiempopensando = 000; int tiempocomiendo = 000; int tiempoparada = 0000; Random r = new Random (); Mesa mesa = new Mesa ( numfilosofos ); Filosofo [] filosofo = new Filosofo [ numfilosofos ]; for ( int i = 0; i < numfilosofos ; i ++) { filosofo [i] = new Filosofo (r, tiempocomiendo, tiempopensando, mesa, i); filosofo [i]. start (); for ( int i = 0; i < numfilosofos ; i ++) { Thread. sleep ( tiempoparada ); System. out. println (" Parando filósofo "+i+"... "); filosofo [i]. interrupt (); for ( int i = 0; i < numfilosofos ; i ++) { filosofo [i]. join (); 0 0