Programación Orientada a Eventos

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

Federico Peinado

1 HILOS (THREADS) EN JAVA

Concurrencia en Java

Java: Programación Multithread

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

Programación Concurrente en Java

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

Multitarea en Java. Rafa Caballero - UCM

Benemérita Universidad Autónoma del Estado de Puebla

2. Estructura de un programa en Java

Concurrencia en Java

Programación Concurrente en Java

Concurrencia. Primitivas IPC con bloqueo

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

PROGRAMACIÓN EN JAVA

Java y JVM: programación concurrente

Concurrencia en Android LSUB, GYSC, URJC

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

Programación Orientada a Objetos en Java

Hebras y Sincronización en Java

Tema 6. Threads: programas multitarea

Benemérita Universidad Autónoma del Estado de Puebla

Object 1. Threads en Java

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

void main(void) { string lname; list <string> lnamelist; cout << "Please enter your list of last names finishing with `.`"<<endl;

Introducción a la Programación Orientada a Objetos

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

Hilos en Java. Crear un Hilo. Detener un hilo. Fuente:

1. Visión general de RMI

Modelo de Objetos Distribuidos

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

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

11. Algunas clases estándar de Java (II)

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

UPM Concurrencia en Java

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

Modulo 1 El lenguaje Java

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

Cliente/Servidor en Java

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

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Programación orientada a objetos

Programación multihebra

3.9 Patrón Distributed callback

Programación concurrente en Java

Uso de excepciones en Java

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

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

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

Sistemas Operativos. Curso 2016 Procesos

Programación Orientada a Objetos con Java

Laboratorio I Java Threads (Silberschatz Galvin)

Java RMI. Sistemas Distribuidos Rodrigo Santamaría

IMPLEMENTACIÓN DE REDES DE PETRI CON TIEMPO EN JAVA

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

9. Objetos y clases Clases

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

Señal de petición de Interrupción

2.1. Introducción al lenguaje Java

Monitores Ing. Iván Medrano Valencia

Programación Orientada a Objetos en JAVA

Excepciones. Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial. Excepciones

15. Parámetros o argumentos

Concurrencia en.net David Jesús Horat Flotats

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

Programación concurrente Hebras

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

Universidad de Cantabria

Curso Online de Programación Java

Arquitecturas cliente/servidor

1 (2 5 puntos) Responda con brevedad y precisión a las siguientes preguntas:

Sistemas Operativos. Características de la Multiprogramación. Interacción entre Procesos. Características de la Multiprogramación

2.2.- Paradigmas de la POO

Programación Concurrente y Paralela. P(S) ; sección crítica P(S);

EXCEPCIONES EN JAVA. Las sentencias que tratan las excepciones son try y catch. La sintaxis es:

Threads o Hilos. Marco Besteiro y Miguel Rodríguez

Introducción a Java LSUB. 15 de enero de 2015 GSYC

Tema 12: Programación multihilo

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

Introducción a la programación orientada a objetos

SIMM: TEORÍA DE LOS S.O. I.E.S. JUAN DE LA CIERVA CURSO 2007/2008

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

Patrones de Diseño. Patrón estructural Decorator. Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)

Ejemplo de lectura por teclado de un número entero: int n; System.out.print("Introduzca un número entero: "); n = sc.nextint();

Java Inicial (20 horas)

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

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

Java en 2 horas. Rodrigo Santamaría

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

Lo básico de Javascript. ISIS2603 Departamento de Sistemas y Computación Universidad de los Andes

3. PROGRAMACION CONCURRENTE

Programación Java. Práctica 11. Javier García de Jalón José Ignacio Rodríguez Alfonso Brazález Alberto Larzabal Jesús Calleja Jon García

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

CDI Exclusión mutua a nivel alto. conceptos

Este capítulo cubre los siguientes aspectos, de los objetivos del examen de certificación en Java:

Unidad II: Administración de Procesos y del procesador

Sistemas Operativos Práctica 4

Sistemas Operativos Ingeniería de telecomunicaciones Sesión 2: Procesos e hilos (modificado 29/10)

Transcripción:

Programación Orientada a Eventos Técnicas de Programación Santiago Pavón V:2012.03.13

Programas Secuénciales El flujo de ejecución del programa sigue la secuencia de sentencias que lo forman. El estado del programa: n definido por el punto del programa en el que estamos ejecutando. n (Más los datos)

Sistemas Dirigidos por Eventos Programas que atienden a sucesos (eventos) que ocurren, y dependiendo de cuales sean, se ejecutan diferentes funciones. n Ejemplo: aplicación con una interface gráfica. No existe un único flujo de ejecución. Como se programa? n Se especifican los eventos a los que debe responder el programa. n Se especifican las acciones a realizar cuando ocurren los eventos. Funcionamiento asíncrono.

Tipos de Eventos Externos: Producidos por el usuario. Ejemplos: pulsaciones de teclado o ratón. Internos: Producidos por el sistema o la aplicación. Ejemplos: n vencimiento de un temporizador. n datos en líneas de comunicaciones.

Estado del Programa Dirigido por Eventos Más difícil de conocer que en un sistema secuencial. n Suelen ser Multihilo n Existen varios módulos ejecutándose a velocidades relativas diferentes. n Los eventos internos ocurren en cualquier momento. n El usuario decide que módulos ejecuta, cuando, y cuantas veces. n Pueden existir módulos que no se ejecuten nunca, o que se ejecuten varias instancias simultáneamente. n Existen datos compartidos entre todos los módulos. n etc

Qué soporte se necesita? Elementos que monitoricen cuando se producen los eventos, los capturen, y los metan en una cola. Un planificador o distribuidor que saque un evento de la cola y se lo pase al módulo que debe reaccionar ante él.

Marcos de Aplicación Conjunto de librerías que facilitan la tarea de desarrollar cierto tipo de aplicaciones: n Proporcionan soporte en tiempo de ejecución. n Manejo de la entrada por ratón y teclado. n Gestión de sistemas de ventanas. n Etc. La disponibilidad de un marco de aplicación para realizar sistemas dirigidos por eventos simplifica su desarrollo.

Desarrollo de GUI Aplicaciones con una Interface Gráfica de Usuario son casos típicos de Sistemas Dirigidos por Eventos. Los marcos de aplicación para el desarrollo GUI suelen proporcionar: n Componentes MVC: w Vistas: interface de la aplicación (parte visible o ventanas) que pinta los datos del modelo. w Controles: manejan las entradas del usuario y actúan sobre los modelos. w Modelos: contienen los datos, los manipulan según solicitan los controles, y actualizan las vistas. n Control y gestión de los eventos

Soporte en Java Java proporciona un marco de aplicación que facilita el manejo de eventos y la creación de GUI. Proporciona numerosas clases que utilizarán los programas que desarrollaremos, adaptándolas previamente mediante herencia y redefinición de métodos.

Modelo de eventos Generador de Eventos XXXEvent addxxxlistener(xxxlistener) removexxxlistener(xxxlistener) Escuchador Eventos XXXEvent implements XXXListener Escuchador Eventos XXXEvent implements XXXListener Java 1.1 y siguientes

El GUI y el Main Thread Para que el GUI responda con agilidad los eventos deben atenderse rápidamente. n Los listeners (manejadores de eventos) deben ejecutar poco código. n Crear Thread para realizar tareas largas. Muy Importante: Al GUI sólo debe accederse desde el Main Thread (event dispatch thread). Los modelos (MVC) son zonas críticas.

javax.swing.swingutilities public static void invokeandwait(runnable dorun) throws InterruptedException, InvocationTargetException public static void invokelater(runnable dorun)

Concurrencia: Hebras

Hebras en Java Hebras o hilos (threads): Unidades de ejecución concurrente dentro de un programa n Son objetos que ejecutan en concurrencia con el resto del programa el código predefinido en run() Se crean por herencia n Clase Thread n Interfaz Runnable Son procesos ligeros n comparten memoria (variables)

Ejemplo public class DosHebras { public static void main (String args[]) { Hebra h1 = new Hebra(1); Hebra h2 = new Hebra(2); h2.start(); h1.start(); } } class Hebra extends Thread { private int me; Hebra (int me) { this.me=me; } public void run () { while (true) System.out.println(me); } }

Ejemplo public class DosHebras { public static void main (String args[]) { new Hebra(1).start(); new Hebra(2).start(); } } class Hebra extends Thread { private int me; Hebra (int me) { this.me = me; } public void run () { while (true) System.out.println(me); } }

Comienzo y fin de una hebra Comienzo de la ejecución de una hebra n start(): Arranca ejecución concurrente del método run() Final de la ejecución de una hebra n Al retornar de run() n Al ejecutar stop() w NO ES SEGURO. DEPRECADO n Al ocurrir una excepción no capturada

public class Hebra extends Thread { private int me; private boolean parar; Hebra (int me) { this.me = me;} public void run () { while ( parar) { System.out.write(me); } } public void parar() { parar = true; } }

Estados de una hebra Thread.State: n n n n n n NEW: creada pero no arrancada. RUNNABLE: se está ejecutando en la JVM, aunque en un determinado momento no tenga el procesador. BLOQUED: bloqueada esperando por el semáforo un objeto. Para entrar en una zona synchronized, o continuar tras un wait. WAITING: esperando indefinidamente a que otra hebra realice alguna acción. w Se invocó wait() y se espera por un notify() w Se invocó join() y se espera por el fin de otra hebra. TIMED_WAITING: esperando a que otra hebra realice alguna acción, pero con un temporizador. w Se invocó sleep, wait o join con un tiempo. TERMINATED: terminada su ejecución.

yield() y sleep(..) yield() n Cede el paso a otra hebra. La hebra sigue activa. sleep(long millis) n Bloquea la hebra millis milisegundos public class Hebra extends Thread { private int me; public Hebra (int me) { this.me = me;} public void run () { while (true) { System.out.write(me); yield();} // o sleep(50) } }

Otros métodos suspend() y resume() n suspend() deja la hebra bloqueada hasta invocar resume() n DEPRECADO join() n permite esperar hasta la muerte de otra hebra

Ejecución y Prioridades Prioridad de una hebra n Valores enteros definidos en la clase Thread w MIN_PRIORITY < NORM_PRIORITY < MAX_PRIORITY método: getpriority () n devuelve la prioridad de una hebra método: setpriority(int newpriority) n asigna una nueva prioridad

Clase Thread Permite derivar objetos que se ejecutan en una hebra separada n Una clase derivada de Thread w no puede derivar de otra clase n Por eso existe el interface Runnable El código ejecutable de la hebra se define en el método run()

Interface Runnable Cualquier clase que implemente esta interface puede ejecutarse como una hebra separada n Esto permite dotar a clases derivadas de otras de capacidad de ejecución concurrente El método run contiene las sentencias que se ejecutan concurrentemente. public interface Runnable { void run(); }

Ejemplo public class Orador { public static void main (String args[]) { Orador o1 = new Orador( Hola ); Orador o2 = new Orador( Mundo ); new Thread(o1).start(); new Thread(o2).start(); } } class Orador extends Persona implements Runnable { private String msg; public Orador (String msg) { this.msg=msg; } public void run () { while(true) System.out.write(msg); } }

Región crítica Segmento de un programa donde n se accede a variables compartidas desde varias hebras w Existe peligro de llegar a resultados inconsistentes w El acceso debe ser con exclusión mutua Exclusión mutua: n n Mecanismo que garantiza a una hebra el acceso exclusivo a una región critica Otras hebras no pueden entrar w hasta que la hebra que ha entrado salga de la región crítica

Ejemplo región crítica new Hebra(1).start(); new Hebra(2).start(); class Hebra extends Thread { static private int i = 0; private int me; static private Object lock = new Object(); public Hebra(int me) { this.me = me;} public void run () { try { while (true) { synchronized (lock) { System.out.println(me + : + i++); sleep(1000); } } } catch (Exception e) {} } }

Ejemplo región crítica class CuentaCorriente { private int saldo = 3000; // Evitar acceso concurrente public synchronized void ingresarnomina() { saldo += 1000; } public synchronized void pagartarjeta() { saldo -= 250; } } final CuentaCorriente cc = new CuentaCorriente(); new Thread() { public void run() { cc.ingresarnomina(); } }.start(); new Thread() { public void run() { cc.pagartarjeta(); } }.start();

Sentencia synchronized synchronized (objeto) {... } n n Delimita una región critica w donde se garantiza exclusión mutua en el acceso El semáforo de objeto controla el acceso w Todos los accesos a la región critica deben referirse al mismo objeto n Todos los objetos o arrays llevan asociado un semáforo También existen métodos sincronizados... synchronized void swap() { // intercambio de valores k=j; j=i; // se garantiza que una vez que el i=k; // intercambio comienza, este se realiza } // completamente...

Bloqueo (Deadlock) Bloqueo: situación irresoluble de espera mutua que bloquea un conjunto de hebras n Las esperas suelen ser de acceso a regiones críticas w Especialmente cuando hay anidamientos de esperas n Deben eliminarse por completo de un programa Son muy difíciles de detectar n Su ocurrencia suele ser aleatoria

Ejemplo: Bloqueo public class HebraB extends Thread { int me, cont; Object locka, lockb; public HebraB(int me, Object a, Object b) { this.me=me; locka=a; lockb=b;} public void run () { while (true) { synchronized (locka) { System.out.println(me+ en rc1: + cont++); synchronized (lockb) { System.out.println(me+ en rc2: + cont++); } } } } public static void main (String args[]) { Object lock1=new Object(), lock2=new Object(); new HebraB(1,lock1,lock2).start(); new HebraB(2,lock2,lock1).start(); } }

Envío de señales entre hebras Todo objeto lleva asociado un semáforo n Permite ordenar los accesos concurrentes n El semáforo se hereda de la clase Object w El semáforo incluye una cola de procesos bloqueados a la espera de poder acceder al objeto wait(), notify() y notifyall() n Métodos que permiten sincronizar hebras w wait(): bloquea la hebra llamante en el semáforo del objeto w notify(): despierta una hebra bloqueada en el semáforo w notifyall(): despierta todas las hebras bloqueada en el semáforo

Buffer public class Buffer { final static private int MAXSIZE = 100; private int datos[] = new int[maxsize]; private int posent=0, possal=0, n=0; public synchronized int get() throws Exception { while (n == 0) wait(); int a = datos[possal]; possal = incr(possal); if (n == MAXSIZE) notify(); n--; return a; } public synchronized void put(int c) throws Exception { while (n == MAXSIZE) wait(); datos[posent] = c; posent = incr(posent); if (n == 0) notify(); n++; } private int incr(int v) { return (v+1)%maxsize; } }