Java: Programación Multithread
|
|
- Tomás Navarrete Castellanos
- hace 8 años
- Vistas:
Transcripción
1 Qué es un thread? Java: Programación Multithread Hasta el momento hemos desarrollado programas secuenciales con un único thread: en cualquier instante durante la ejecución de un programa hay un único punto de ejecución. Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile Un programa Un thread 2 Qué es un thread? (cont.) Un thread es un flujo secuencial de control dentro de un programa Un programa puede tener más de un thread ejecutándose al mismo tiempo Ejemplo Una aplicación que posee un thread que saluda y otro que se despide: Un programa Dos threads for(int i = 1; i<100;i++) for(int i = 1; i<100;i++) Un programa System.out.printl( Hola + i ); System.out.printl( Chao + i ); Dos threads 3 4
2 Ejemplo (cont.) Creación de múltiples threads en Java Output posible: Hola 1 Hola 2 Chao 1 Hola 3 Chao 2 Chao 3 Hola 4 Los threads en Java se implementan por medio de la clase java.lang.thread. Existen dos formas de crear threads en Java: Extendiendo la clase java.lang.thread Implementando la interfaz java.lang.runnable 5 6 Creación de threads extendiendo la clase java.lang.thread El thread debe ser una clase que extiende la clase Thread Se debe sobreescribir el método run() con el código que deberá ser ejecutado por el thread. El thread debe ser lanzado invocando el método start() del objeto (heredado de la clase Thread) Creación de threads extendiendo la clase java.lang.thread: ejemplo 1 Dos ejemplos de clases que extienden Thread: public class Hola extends Thread { for (int i=1;i<100;i++) System.out.println( "Hola" + i ); public class Chao extends Thread { for (int i=1;i<100;i++) System.out.println( "Chao" + i ); 7 8
3 Creación de threads extendiendo la clase java.lang.thread: ejemplo 1 (cont.) Qué ocurre en este ejemplo? La aplicación que lanza los threads: public class EjemploThreadSimple { Hola h = new Hola(); Chao c = new Chao(); h.start(); c.start(); System.out.println( Fin programa ); Notar que para lanzar un nuevo thread se debe invocar el método start(). La simple invocación del método run()produce sólo su ejecución en el thread actual (como cualquier otro método). Hola h = new Hola(); Chao c = new Chao(); h.start(); c.start(); System.out.println( Fin programa ); Thread Chao Thread main h.start(); c.start(); Thread Hola 9 10 Ejecución del ejemplo 1 NOTA: Ejecución en JVM sobre Windows XP. El resultado puede ser distinto en otras plataformas (se estudiará más adelante) Estos dos programas funcionan de igual modo Si las referencias a los threads no son necesarias public class EjemploThreadSimple { Hola h = new Hola(); Chao c = new Chao(); h.start(); c.start(); System.out.println( Fin programa ); public class EjemploThreadSimple { new Hola().start(); new Chao().start(); System.out.println( Fin programa ); 11 12
4 Creación de threads implementando la interfaz java.lang.runnable La clase que contiene el proceso que será lanzado dentro de un nuevo thread debe implementar la interfaz java.lang.runnable Particularmente se debe implementar en la clase el método run() declarado en Runnable, con el código que deberá ser ejecutado por el thread Para lanzar el thread se debe crear una instancia de java.lang.thread, pasando al constructor de éste una referencia al objeto que implementa Runnable, y luego se debe invocar el método start() del objeto Thread Creación de threads implementando la interfaz java.lang.runnable (cont.) Clase que implementa el código del thread: public class MiThread implements Runnable { // código del thread Instanciación y lanzamiento del thread: Thread t = new Thread( new MiThread() ); t.start(); Creación de threads implementando la interfaz java.lang.runnable: ejemplo 2 Dos ejemplos de clases que implementan Runnable: public class Hola implements Runnable { for (int i=1;i<100;i++) System.out.println( "Hola" + i ); public class Chao implements Runnable { for (int i=1;i<100;i++) System.out.println( "Chao" + i ); 15 Creación de threads implementando la interfaz java.lang.runnable: ejemplo 2 (cont.) La aplicación que lanza los threads: public class EjemploThreadSimple { Thread h = new Thread( new Hola() ); Thread c = new Thread( new Chao() ); h.start(); c.start(); System.out.println( Fin programa ); Notar que para lanzar un nuevo thread se debe crear una instancia de Thread pasando al constructor una referencia a un objeto Runnable, e invocar el método start() sobre Thread. La simple invocación del método run() produce sólo su ejecución en el thread actual (como cualquier otro método). 16
5 (Nuevamente) si las referencias a los threads no son necesarias Ejercicio Estos dos programas funcionan de igual modo public class EjemploThreadSimple { Thread h = new Thread( new Hola() ); Thread c = new Thread( new Chao() ); h.start(); c.start(); System.out.println( Fin programa ); public class EjemploThreadSimple { new Thread( new Hola() ).start(); new Thread( new Chao() ).start(); System.out.println( Fin programa ); Cree un programa similar al ejemplo anterior que, en vez de usar clases distintas para manejar los threads correspondientes a los diferentes mensajes ( Hola, Chao ), utilice dos thread de una misma clase (cuyo mensaje sea configurable). Haga una implementación del thread extendiendo la clase Thread y otra implementando Runnable. Haga la aplicación que lance los threads Solución Versión que extiende Thread: public class Habla extends Thread { String mensaje; public Habla(String msg){ mensaje = msg; for (int i=1;i<100;i++) System.out.println( mensaje + i ); public class Ejercicio { Habla h = new Habla( Hola ) ; Habla c = new Habla( Chao ); h.start(); c.start(); 19 Solución (cont.) Versión que implementa Runnable: public class Habla implements Runnable { String mensaje; public Habla(String msg){ mensaje = msg; for (int i=1;i<100;i++) System.out.println( mensaje + i ); public class Ejercicio { Thread h = new Thread( new Habla( Hola ) ) ; Thread c = new Thread( new Habla( Chao ) ); h.start(); c.start(); 20
6 Métodos útiles de la clase Thread: sleep Métodos útiles de la clase Thread: sleep Ejemplo Detiene la ejecución del thread actual por la cantidad de milisegundos indicada como parámetro. public static void sleep(long millis) throws InterruptedException Ejemplo: public class MyThread extends Thread { try{ sleep( 1000 ); catch(interruptedexception e){ //Interrupción Equivalente: Thread.sleep( 1000 ); NOTA: Si en vez de extender Thread se hubiese implementado Runnable, entonces aquí hubiese sido necesaria la referencia a la clase Thread para invocar el método sleep(). public class Hola extends Thread { for (int i=1;i<10;i++){ System.out.println( "Hola" + i ); try{ Thread.sleep( 1000 ); catch(interruptedexception e){ public class Chao extends Thread { for (int i=1;i<10;i++){ System.out.println( "Chao" + i ); try{ sleep( (long) ( Math.random() * 1000) ); catch (InterruptedException e){ Detención de 1000 ms (1 segundo) Tiempo de detención al azar Métodos útiles de la clase Thread: sleep Ejemplo Métodos útiles de la clase Thread: yield Detiene la ejecución del thread actual y permite a otros threads ser ejecutados public static void yield() Ejemplo: public class MyThread extends Thread { yield(); Equivalente: Thread.yield(); NOTA: Si en vez de extender Thread se hubiese implementado Runnable, entonces aquí hubiese sido necesaria la referencia a la clase Thread para invocar el método yield()
7 Métodos útiles de la clase Thread: yield (Ejemplo) Métodos útiles de la clase Thread: yield (Ejemplo) public class Hola extends Thread { for (int i=1;i<10;i++){ System.out.println( "Hola" + i ); Thread.yield(); public class Chao extends Thread { for (int i=1;i<10;i++){ System.out.println( "Chao" + i ); yield(); Ciclo de vida de un thread Ciclo de vida de un thread (cont.) Nuevo thread (New Thread) start Ejecutándose (Running) yield Ejecutable (Runnable) sleep wait bloqueado en I/O No ejecutable (Not Runnable) Inicio de un thread - el thread se ha creado ( Nuevo thread ) y se invoca el método start. El thread pasa al estado ejecutable. Transición del estado ejecutable al estado no ejecutable - ocurre por uno de estos tres motivos: El thread invoca el método sleep El thread invoca el método wait (*) El thread se bloquea en una operación de I/O finaliza el método run Muerto (Dead) Tomado de The Java Tutorial Sun Microsystems (*) será estudiado más adelante 27 28
8 Ciclo de vida de un thread (cont.) Transición del estado no ejecutable a ejecutable : si el thread había invocado el método sleep, el número de milisegundos de pausa ha transcurrido si el thread había invocado el método wait de un objeto, otro thread lo notifica de continuar por llamando al método notify o al método notifyall del mismo objeto (*) si el thread estaba bloqueado en operación de I/O, la operación se ha completado (*) serán estudiados más adelante Ciclo de vida de un thread (cont.) Transición del estado ejecutable al estado muerto : ocurre cuando el método run llega a su fin. El método isalive ayuda a conocer el estado de un thread: Retorna true si el thread ha sido lanzado (método start invocado) y no detenido Retorna false si el thread está en el estado Nuevo thread (no ha sido lanzado) o está muerto (método run terminado) Paralelismo Ejecución de threads En un sistema con múltiples CPU, cada CPU podría ejecutar un thread distinto Concurrencia Si no es posible el paralelismo, una CPU es responsable de ejecutar múltiples threads Thread A Thread A Thread A Thread B Thread B Thread B Thread A Thread B Thread A Prioridades de los threads La ejecución de múltiples threads en una sola CPU requiere la determinación de una secuencia de ejecución ( scheduling ) Java soporta un algoritmo de secuenciación de threads simple denominado fixed priority scheduling Este algoritmo secuencia la ejecución de threads en base a la prioridad relativa que les ha sido asignada CPU CPU CPU 31 32
9 Prioridades de los threads (cont.) Cuando se crea un nuevo thread, su prioridad relativa es la misma que la del thread que lo creó La prioridad de un thread puede ser cambiada en cualquier momento por medio del método setpriority. Este método recibe un entero que indica el valor de prioridad (valores más altos indican más altas prioridades) La clase Thread declara tres constantes: public static final int MAX_PRIORITY 10 public static final int MIN_PRIORITY 1 public static final int NORM_PRIORITY 5 El fixed priority scheduling de Java Entre todos los threads en estado ejecutable es escogido el thread con la prioridad más alta Si hay dos threads con la misma prioridad, es escogido uno de ellos en modo round-robin Cuando el thread en ejecución pasa al estado no ejecutable o muerto otro thread es seleccionado para su ejecución. La ejecución de un thread es interrumpida si otro thread con más alta prioridad se vuelve ejecutable Threads y la portabilidad de Java: debilidades La responsabilidad de ejecución de los threads es pasada al sistema operativo Pero distintos sistemas operativos manejan los threads en distinta forma: por ejemplo NT y Solaris tienen diferentes niveles de prioridades (incluso diferentes respecto los que define Java) Threads y la portabilidad de Java: debilidades (cont.) La cosa puede ser peor aun: existen sistemas operativos que implementan time slicing (subdivisión de tiempo): el sistema operativo asigna una porción de tiempo a la ejecución de cada thread. En este caso la ejecución de un thread es interrumpida no sólo si otro thread con más alta prioridad se vuelve ejecutable, sino también cuando su tiempo asignado de ejecución se acaba. (no todos los sistemas operativos implementan time slicing) 35 36
10 Threads egoístas Si un sistema operativo no implementa time slicing, y si el thread no sale del estado ejecutable, este continuará su ejecución hasta que muera. Mientras tanto, ningún otro thread podrá ser ejecutado. Volvamos el ejemplo inicial: public class Habla extends Thread { String mensaje; public Habla(String msg){ mensaje = msg; for (int i=1;i<100;i++) System.out.println( mensaje + i ); En un sistema sin time slicing, este se vuelve un thread egoísta. 37 Threads egoístas (cont.) Por lo tanto el siguiente programa ejecutará: ambos threads contemporáneamente en un sistema con time slicing (véase su ejecución en ejemplos anteriores) sólo el thread que imprime Hola hasta terminar las 99 impresiones, y luego el thread que imprime Chao, en un sistema que no soporta time slicing public class Ejercicio { Habla h = new Habla( Hola ) ; Habla c = new Habla( Chao ); h.start(); c.start(); 38 Moraleja sobre el egoísmo y los threads No se debe asumir que la ejecución de una aplicación se hará siempre en un sistema que soporta time slicing. Por lo tanto, se debe incluir adecuadamente invocaciones a los métodos yield, sleep y wait, si los threads no se bloquean en operaciones de I/O. public class Habla extends Thread { String mensaje; public Habla(String msg){ mensaje = msg; for (int i=1;i<100;i++){ System.out.println( mensaje + i ); yield(); Acceso a datos compartidos Es común que dos o más threads tengan acceso a objetos en común Ejemplo Supongamos una aplicación con dos threads que actualizan un objeto compartido, de la clase Historial: public class Historial { String[] mensajes = new String[1000]; int pos = 0; public void agregar(string msg) { mensaje[pos] = msg; 39 40
11 Acceso a datos compartidos (cont.) Acceso a datos compartidos (cont.) public class Habla extends Thread { String mensaje; Historial historial; public Habla(String msg, Historial h){ mensaje = msg; historial = h; for (int i=1;i<100;i++){ historial.agregar( mensaje ); yield(); Se espera que ocurra lo siguiente: Thread Hola mensaje[pos]=msg; mensaje[0]= Hola pos = 1 Thread Chao mensaje[pos]=msg; mensaje[1]= Chao pos = 2 public class Ejercicio { Historial historial = new Historial(); Habla h = new Habla( Hola, historial ) ; Habla c = new Habla( Chao, historial ); h.start(); c.start(); mensaje[pos]=msg; mensaje[2]= Hola pos = 3 mensaje[pos]=msg; mensaje[3]= Chao pos = Acceso a datos compartidos (cont.) Pero podría ocurrir lo siguiente: Thread Hola mensaje[pos]=msg; pos = 2 mensaje[pos]=msg; mensaje[pos]=msg; pos = 5 mensaje[0]= Hola mensaje[2]= Hola pos = 3 mensaje[3]= Hola Thread Chao mensaje[pos]=msg; mensaje[pos]=msg; pos = 4 mensaje[0]= Chao pos = 1 mensaje[3]= Chao Bloqueo del objetos compartidos La sincronización para el acceso a objetos compartidos se basa en el concepto de monitor, desarrollado por C.A.R. Hoare. Un monitor es una porción de código protegida por un mutex ( mutual exclusion semaphore ). Sólo un thread puede tener el mutex de un objeto en un momento dado. Si un segundo thread trata de obtener un mutex ya adquirido por otro thread, se bloquea hasta que el primero libere el mutex. Al momento de liberarse un mutex, todos los threads en espera de él se despertarán ; en base a algún criterio (orden de prioridad, FIFO, etc.) el mutex será dado a uno de ellos
12 Bloqueo del objetos compartidos: analogía Un edificio en el cual algunas oficinas tienen llave y otras tiene libre acceso. El monitor es el conjunto de oficinas cuyo acceso requiere la llave. Los threads son las personas que quieren acceder a las oficinas. Para entrar a una oficina con llave, una persona tiene que obtener el manojo con las llaves de la oficina. El manojo con las llaves es el mutex del edificio: solo la persona que tiene el manojo puede ingresar a las oficinas con llave. Las otras son de libre acceso. Objeto Threads Mutex Bloqueo del objetos compartidos: métodos synchronized En Java el bloqueo de un objeto ocurre cuando un thread entra a un método declarado como synchronized (de un objeto compartido). Ejemplo: public class Historial { public synchronized void agregar(string msg) { mensaje[pos] = msg; Al momento de entrar a un método synchronized de un objeto compartido, un thread se encontrará con una de las siguientes situaciones: Mutex libre: el thread tomará el mutex, ejecutará el método y lo liberará sólo al momento de terminar la ejecución de dicho método. Mutex tomado por otro thread: el thread se bloqueará en espera de que el primero lo libere Bloqueo del objetos compartidos: métodos synchronized (cont.) Consecuencia: sólo un thread a la vez podrá ejecutar un método synchronized sobre un objeto. Al interrumpirse la ejecución de un thread que accede a un método synchronized, el paso se dará a otro thread que no requiera el mutex sobre tal objeto (i.e. que no esté solicitando la ejecución de cualquiera de sus métodos synchronized). Una vez liberado el mutex, los threads bloquados en espera de él se vuelven ejecutables. Objeto Bloqueo del objetos compartidos: métodos synchronized (cont.) En el caso de nuestro ejemplo, mientras un thread se encuentra ejecutando el método agregar, ningún otro thread puede ejecutar dicho método (pues la ejecución de agregar requiere el mutex del objeto historial). Thread Hola mutex Thread Chao historial.agregar() mensaje[pos]=msg; historial historial.agregar() 47 48
13 Bloqueo del objetos compartidos: métodos synchronized (cont.) La invocación a sleep dentro de un thread no libera el mutex de los objetos que eventualmente pudiera tener en su poder. Métodos synchronized: ejemplo En el ejemplo de la clase Historial, el método agregar requiere ser synchronized, en cambio getcapacidad no lo requiere: Objeto Z z z z public class Historial { String[] mensajes = new String[1000]; int pos = 0; public synchronized void agregar(string msg) { mensaje[pos] = msg; public int getcapacidad(){ return mensajes.length; Métodos synchronized En la clase Historial, el método que retorna el número de elementos ingresados al arreglo debe ser synchronized? public class Historial { String[] mensajes = new String[1000]; int pos = 0; public synchronized void agregar(string msg) { mensaje[pos] = msg; public int getcapacidad(){ return mensajes.length;? public synchronized int getelementos() { return pos; Cuándo deben declararse métodos synchronized? En actualizaciones sobre variables de instancia de objetos que no sean operaciones atómicas: actualización de dos o más variables actualización de variables long, double otros? El costo de declarar métodos synchronized es: mayor lentitud de la ejecución de métodos (por la adquisición del mutex) peligro de deadlock: bloqueo mutuo de dos threads que esperan adquirir mutex intercambiados 51 52
14 Ejemplo de deadlock Dadas las clases Batman y Robin: public class Batman { Robin robin; public void setasistente( Robin robin ){ this.robin = robin; public synchronized void vuelveabaticueva(){ robin.subealbatimovil(); public synchronized usabatiboomerang(){ // usa el batiboomerang como arma de defensa public class Robin { Batman batman; public void setjefe( Batman batman ){ this.batman = batman; public synchronized powtonkpafbonk(){ batman.usabatiboomerang(); 53 Ejemplo de deadlock (cont.) y una aplicación que instancia dichas clases y las usa como objetos compartidos por diferentes threads: public class CiudadGotica { public static void main( String[] arg){ Batman batman = new Batman(); Robin robin = new Robin(); batman.setayudante( robin ); robin.setjefe( batman ); // aquí se inician distintas operaciones con threads, // entre ellos un thread Alfred y otro thread Pingüino NOTA: Ejemplo adaptado de Programming Java Threads in the real world (Parte 2), Allan Holub, disponible on-line: 54 Ejemplo de deadlock (cont.) Imagine que en el ejemplo anterior ocurre lo siguiente: 1.Un thread llamado Alfred invoca el método vuelveabaticueva() sobre el objeto batman. Alfred obtiene el mutex de batman pero justo antes de que este método invoque el método subealbatimovil() de robin, su ejecución es interrumpida. (Clase Batman) public synchronized void vuelveabaticueva(){ robin.subealbatimovil(); 2.Otro thread, llamado Pingüino, invoca el método powtonkpafbonk() de robin. El thread Pingüino obtiene el mutex de robin, y trata de ejecutar la instrucción batman.usabatiboomerang(). Para lograrlo debe adquirir también el mutex de batman, pero como éste está en poder del thread Alfred, se bloquea en espera de su liberación. (Clase Robin) public synchronized powtonkpafbonk(){ batman.usabatiboomerang(); 55 Ejemplo de deadlock (cont.) 3. Entonces el thread Alfred es reactivado, y trata de invocar subealbatimovil() sobre robin. Para invocarlo, sin embargo, debe adquirir el mutex de robin que está en poder del thread Pingüino. (Clase Batman) public synchronized void vuelveabaticueva(){ robin.subealbatimovil(); 4. A este punto el thread Pingüino no puede reactivarse porque no puede obtener el mutex de batman (lo tiene el thread Alfred), ni tampoco el thread Alfred puede hacerlo, porque no puede obtener el mutex de robin (lo tiene el thread Pingüino) Deadlock! 56
15 Re-adquisición del mutex En Java un thread puede re-obtener el mutex de un objeto que éste ya tiene. public class NoIncurroEnAutoDeadlock { public synchronized void a(){ b(); public synchronized void b(){ System.out.println( Estoy en b ); Esto evita que un thread incurra en deadlock por culpa de él mismo. Bloques synchronized Es posible declarar como synchronized porciones de código dentro de un método de una clase. Esto permite implementar exclusión mutua sobre bloques de instrucciones. Formato: synchronized( objeto ){ // instrucciones Un thread, al ingresar a un bloque synchronized se bloquea en espera de la adquisición del mutex asociado al objeto (o arreglo) declarado en su encabezado. El mutex es liberado a la salida del bloque Bloques synchronized: ejemplo En el siguiente ejemplo, el método avanzar adquiere el mutex de motor para ejecutar algunas instrucciones: public class Robot{ Motor motor = new Motor(); public void avanzar(){ if( encendido() ) synchronized( motor ){ avanzando = true; motor.aplicarpotencia( 10 ); else preguntar( Desea encender, Si, No ); Bloques synchronized: ejemplo Consecuencia: dado que en el bloque synchronized es adquirido el mutex de motor, ningún otro thread que requiera dicho mutex podrá ser ejecutado concurrentemente. En consecuencia se obtiene un acceso con exclusión mutua sobre la instancia de Motor, aun cuando esta clase no tenga ningún bloque ni método synchronized
16 Bloques y métodos synchronized El objeto asociado al bloque synchronized puede ser la misma instancia sobre la cual se ejecuta el método (referencia this). Como consecuencia, las siguientes implementaciones son equivalentes: public class MiClase{ public synchronized void mimetodo(){ // Instrucciones public class MiClase{ public void mimetodo(){ synchronized( this ){ // Instrucciones 61 Bloques synchronized (cont.) Se pueden crear exclusiones en/entre métodos específicos: public class Acta{ double[] notascatedra = new double[10]; double[] notasayudantia = new double[10]; public void actualizarcatedra(){ synchronized( notascatedra ); // Instrucciones public void imprimircatedra(){ synchronized( notascatedra ); // Instrucciones public void actualizarayudantia(){ synchronized( notasayudantia ); // Instrucciones public void imprimirayudantia(){ synchronized( notasayudantia ); // Instrucciones Excluyentes Excluyentes 62 Sincronización de threads El problema consiste en lograr que un thread actúe sólo cuando otro ha concluido cierta actividad (y viceversa): threads mutuamente excluyentes. Problema del productor/consumidor: Un thread (Productor) genera un elemento que es agregado a un depósito, este elemento es consumido por otro thread (Consumidor) El depósito tiene capacidad limitada, cuando está lleno, el Productor debe esperar que se disponga de espacio nuevamente. Por su parte el consumidor debe esperar que haya elementos para poder retirarlos. 63 Supongamos que la capacidad del depósito es igual a 1: Productor Sincronización de threads Depósito Consumidor El problema es más complejo que en los ejemplos anteriores: el depósito no sólo debe soportar acceso concurrente, sino que los threads deben también actuar sincronizadamente. 64
17 Ejemplo de sincronización Supongamos la siguiente implementación de un Productor y un Consumidor: public class Productor extends Thread { private Deposito deposito; public Productor(Deposito d) { deposito = d; for (int i=1;i<20 ;i++ ) deposito.guardar(); public class Consumidor extends Thread{ private Deposito deposito; public Consumidor(Deposito d) { deposito = d; for (int i=1;i<20 ;i++ ) deposito.sacar(); Ambos actúan sobre un objeto compartido de la clase Deposito. Sincronización de threads: una solución simplista Una solución simple sería que el productor verificara cada vez si hay espacio en el depósito, y si lo hay, entonces agregara un elemento a él. Lo mismo podría hacer el consumidor antes de intentar sacar un elemento del depósito. public class Deposito{ private int elementos = 0; public synchronized void guardar() { if( elementos = 0 ) elementos++; return; public synchronized void sacar() { if( elementos > 0 ) elementos--; return; Sincronización de threads: una solución simplista (cont.) Problema: alto consumo de recursos (CPU) en procesos improductivos. Solución más adecuada: detener los threads hasta que se den las condiciones para que actúen. Sincronización de threads: uso de métodos wait y notify La clase Object provee el método wait() que detiene un thread hasta que le sea notificada la posibilidad de continuar. El método wait debe ser invocado sobre un objeto compartido por los threads a sincronizar (ej. el depósito) Para poder invocar el método wait es necesario que el thread tenga el mutex del objeto compartido La invocación de wait detiene el thread, lo pone en una lista de espera asociada al objeto, y libera su mutex. Objeto CPU Lista de espera wait 67 68
18 Sincronización de threads: uso de métodos wait y notify (cont.) El thread saldrá de la lista de espera cuando otro thread invoque el método notify sobre el objeto compartido. Al salir de la lista de espera, se bloqueará en espera del mutex del objeto para continuar su ejecución. Una vez re-obtenido el mutex del objeto, el thread que salió de la lista de espera continuará la ejecución del método en la instrucción siguiente al llamado a wait. Si hay más de un thread en la lista de espera, notify reactivará sólo uno de ellos. El criterio de selección del thread a re-activar depende de la implementación de Java. Nota: El método wait puede generar una InterruptedException. Sincronización de threads: uso de métodos wait y notify (cont.) Notar que en este modelo la notificación es indirecta: el thread que invoca notify no tiene ninguna referencia al thread que está en espera. La notificación actúa sobre un objeto compartido, y al ser este notificado, un thread en espera es reactivado. Pedro llegué Pedro llegué Lista de espera llegó Pedro Inscripción para notificación (wait) Sincronización de threads: uso del método notifyall El método notifyall permite reactivar todos los threads bloqueados en la lista de espera de un objeto, esto es, se vuelven todos ejecutables. Notar sin embargo que ellos podrán tomar el mutex sólo de uno a la vez. Pedro llegué Lista de espera llegué llegué llegué Inscripción para notificación (wait) 71 Ejemplo de sincronización (cont.) El depósito está implementado de la siguiente forma: public class Deposito{ private int elementos = 0; public synchronized void guardar() { try{ if( elementos > 0) // Más adelante se verá que no está correcto this.wait(); catch( InterruptedException e ){ elementos++; System.out.println( "Guardar - numero elementos: " + elementos ); this.notify(); public synchronized void sacar() { try{ if( elementos == 0) // Más adelante se verá que no está correcto this.wait(); catch( InterruptedException e ){ elementos--; System.out.println( "Sacar - numero elementos: " + elementos ); this.notify(); 72
19 Ejemplo de sincronización (cont.) Ejemplo de sincronización (cont.) La aplicación crea dos threads (Productor y Consumidor), que accesan el objeto compartido (depósito): public class EjemploProductorConsumidor{ public static void main( String[] arg ) { Deposito deposito = new Deposito(); Productor productor = new Productor( deposito ); Consumidor consumidor = new Consumidor( deposito ); productor.start(); consumidor.start(); Ejemplo de sincronización (cont.) Ejemplo de sincronización (cont.) Supongamos en un momento cualquiera que el depósito está vacío y se activa el thread Consumidor Thread Productor Se bloquea en espera del mutex de depósito Adquiere el mutex de deposito Mutex Lista de espera depósito Thread Consumidor Adquiere el mutex de depósito Verifica que depósito tenga elementos. Dado que no los tiene invoca wait del objeto depósito. La invocación de wait libera el mutex de depósito y el thread se agrega a la lista de espera (de depósito). 75 Thread Productor Verifica que depósito esté vacío y agrega un elemento. Invoca notify de depósito. Termina la ejecución del método y libera el mutex. Se bloquea en espera del mutex de depósito Mutex Lista de espera depósito Thread Consumidor Sale de la lista de espera y se bloquea en espera del mutex de depósito. Adquiere el mutex de depósito. Saca el elemento del depósito Invoca notify de depósito (*) (*) El efecto de notify en esta secuencia es nulo, pero qué habría pasado si el mutex de depósito lo Franco Guidi Polanco hubiera ganado el Productor?
20 Sincronización y bloqueo iterativo (spin lock) Sincronización y bloqueo iterativo (spin lock) En la implementación de Deposito existe aun un problema. Suponga que hay mas de un thread Consumidor, el depósito está vacío, y se da la siguiente secuencia de eventos: 1. Un thread Consumidor toma el mutex del depósito, y verifica la existencia de un elemento en él. Dado que el depósito está vacío, invoca el método wait (sobre el depósito), se bloquea en la lista de espera (de depósito), y libera su mutex. if( elementos == 0) this.wait(); 2. El thread Productor es reactivado, adquiere el mutex de depósito, comprueba que éste está vacío, le agrega un elemento, e invoca notify (sobre el objeto depósito). 3. El thread Consumidor que estaba en la lista de espera de depósito es notificado (sacado de dicha lista), y puesto en espera del mutex (de depósito). 4. El thread Productor libera el mutex de depósito. 5. Otro thread Consumidor, que no estaba en la lista de espera de depósito, adquiere su mutex, comprueba que el depósito tiene un elemento, lo saca del depósito, invoca notify (no interesa que ocurre con esto), y libera el mutex de depósito. 6. El primer thread Consumidor (que en el paso 3 había sido sacado de la lista de espera y bloqueado en espera del mutex) adquiere el mutex de depósito (antes de que el thread Productor trate de agregar un elemento), y continúa su ejecución en el punto en que estaba: trata de sacar un elemento, pero el depósito está vacío: ERROR Sincronización y bloqueo iterativo (spin lock) Sincronización y bloqueo iterativo (spin lock) Este problema nace del hecho que la especificación de Java no establece que la salida de la lista de espera y adquisición del mutex sean implementados como una operación atómica (distintas JVM se pueden comportar de distinto modo). Problemas análogos se presentan cuando: Hay más de un Productor. La notificación ocurre con notifyall en vez de notify. Solución al problema anterior: reemplazar la estructura: por: if( condición de detención ) wait(); while( condición de detención ) wait(); Spin lock 79 80
Threads. La plataforma JAVA soporta programas multhreading a través del lenguaje, de librerías y del sistema de ejecución. Dos.
Threads Un thread es un flujo de control secuencial dentro de un programa. A los threads también se los conoce como procesos livianos ó contextos de ejecución. Un thread es similar a un programa secuencial:
Más detalles1 HILOS (THREADS) EN JAVA
1 HILOS (THREADS) EN JAVA 1.1QUÉ ES UN THREAD La Máquina Virtual Java (JVM) es un sistema multihilo. Es decir, es capaz de ejecutar varios hilos de ejecución simultáneamente. La JVM gestiona todos los
Más detallesConcurrencia. Primitivas IPC con bloqueo
Concurrencia Primitivas IPC con bloqueo Primitivas de IPC con bloqueo La solución de Peterson es correcta, pero tiene el defecto de requerir espera ocupada: Cuando un proceso quiere entrar en su región
Más detallesJava nos ofrece la clase Thread y la interfaz Runable que permiten que varios procesos estén funcionando de forma concurrente.
Threads (hilos) Java nos ofrece la clase Thread y la interfaz Runable que permiten que varios procesos estén funcionando de forma concurrente. Conceptos: Proceso (thread o hilo): es un programa en ejecución
Más detallesMultitarea en Java. Rafa Caballero - UCM
Multitarea en Java Rafa Caballero - UCM Programa Monoproceso (monotarea) En cada momento hay una única instrucción ejecutándose Se dice que el programa es monotarea, o monoproceso o monohebra (o single
Más detallesProgramación Orientada a Eventos
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
Más detallesFederico Peinado www.federicopeinado.es
Federico Peinado www.federicopeinado.es Depto. de Ingeniería del Software e Inteligencia Artificial disia.fdi.ucm.es Facultad de Informática www.fdi.ucm.es Universidad Complutense de Madrid www.ucm.es
Más detallesMONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar
MONITORES EN JAVA Un monitor es un objeto que implementa acceso bajo e.m. a todos sus métodos, y provee sincronización En Java, son objetos de una clase cuyos métodos públicos son todos synchronized Un
Más detallesTEMA 5: Control de la Concurrencia en Java (API Estándar)
TEMA 5: Control de la Concurrencia en Java (API Estándar) CONTENIDO Exclusión Mutua con código synchronized. Exclusión Mutua con métodos synchronized. Protocolos de Control de la Exclusión Mutua. Interbloqueos
Más detallesProgramación Concurrente en Java
Hebras y monitores Departamento de Sistemas Informáticos y Programación Universidad Complutense de Madrid 21 de marzo de 2006 Threads Extendiendo la clase java.lang.thread. public class PrThread extends
Más detallesConcurrencia en Java
Concurrencia en Java Herramientas proporcionadas por Java La Máquina Virtual (JVM) Pedro Pablo Gómez Martín La clase Thread Clase principal con la que conseguir concurrencia. La llamada a su método start()
Más detallesHebras y Sincronización en Java
Hebras y Sincronización en Java Jonathan Makuc http://jmakuc.ublog.cl Noviembre 2008 Tópicos: 1. Introducción a hebras en Java...2 2. Hebras a través del clase Thread...3 3. Hebras a través de la interfaz
Más detallesPROGRAMACIÓN EN JAVA
SISTEMAS INFORMÁTICOS INDUSTRIALES curso 2007-2008 PROGRAMACIÓN EN JAVA PRÁCTICA 3: Comunicación entre tareas. Modelo productor / consumidor. Objetivos Implementar una aplicación en Java en la que existan
Más detallesBenemérita Universidad Autónoma del Estado de Puebla
Benemérita Universidad Autónoma del Estado de Puebla Facultad de Cs. De la Computación Programación Concurrente y Paralela Práctica de Laboratorio No. 5 Profr: María del Carmen Cerón Garnica Alumno: Roberto
Más detallesJava: Clases Abstractas e Interfaces
Clases abstractas e interfaces Java: Clases Abstractas e Interfaces Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile fguidi@ucv.cl A nivel conceptual,
Más detallesModulo 1 El lenguaje Java
Modulo 1 El lenguaje Java 13 - Codificación en Java Una de las grandes diferencias entre Java y Pascal en cuando a la codificación es que Java se trata de un lenguaje de los llamados case sensitive Esto
Más detallesCDI Exclusión mutua a nivel alto. conceptos
conceptos El concepto de usar estructuras de datos a nivel alto libera al programador de los detalles de su implementación. El programador puede asumir que las operaciones están implementadas correctamente
Más detallesJava y JVM: programación concurrente
Java y JVM: programación concurrente Adolfo López Díaz Escuela de Ciencias de la Computación e Informática. Universidad de Costa Rica Resumen: El lenguaje de programación Java proporciona, sin necesidad
Más detallesRESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA
UNED Centro Asociado de Cádiz RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA 1. OBJETOS Cualquier elemento del programa es un objeto. Un programa es un conjunto de objetos que se comunican entre sí
Más detallesObject 1. Threads en Java
Object 1 Threads en Java Introducción En este artículo voy a explicar cómo se usan los threads en Java (también traducidos como "hilos de ejecución"). La intención no es solamente explicar cuáles son las
Más detallesClases y Objetos. Informática II Ingeniería Electrónica
Clases y Objetos Informática II Ingeniería Electrónica Los Tipos de Datos Hasta ahora, en un programa podemos usar para representar variables a: Tipos fundamentales : enteros (int), caracteres (char),
Más detallesConcurrencia en Android LSUB, GYSC, URJC
Concurrencia en Android LSUB, GYSC, URJC Repaso de concurrencia en Java Crear un thread Instanciar un Thread, con el método run sobreescrito Intanciar un objeto que cumpla el interfaz Runnable y pasárselo
Más detallesUso de excepciones en Java
Uso de excepciones en Java En Java, cuando se produce un error en un método, se lanza un objeto Throwable. Cualquier método que haya llamado al método puede capturar la excepción y tomar las medidas que
Más detallesProgramación Orientada a Objetos con Java
Programación Orientada a Objetos con Java M.C. Jorge Eduardo Ibarra Esquer jorgeeie@uabc.mx Sobrecarga de métodos Java permite la definición de dos o más métodos que tengan el mismo nombre, dentro de la
Más detallesBenemérita Universidad Autónoma del Estado de Puebla
Benemérita Universidad Autónoma del Estado de Puebla Facultad de Cs. De la Computación Programación Concurrente y Paralela Práctica de Laboratorio No. 4 Profr: María del Carmen Cerón Garnica Alumno: Roberto
Más detallesclass Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }
REUTILIZACIÓN DE CLASES:MODELO DE HERENCIA EN JAVA Java soporta herencia simple pero no múltiple. Lo hace mediante el mecanismo de extensión de clase. A partir de él, una subclase se extiende (hereda)
Más detalles8. Sentencia return y métodos
92 A. García-Beltrán y J.M. Arranz 8. Sentencia return y métodos Objetivos: a) Describir el funcionamiento de la sentencia return b) Interpretar el resultado de una sentencia return en el código fuente
Más detallesSi bien Pascal-FC no trae algunas de las características de Pascal como:
PROCESOS VS. HILOS: Ciclo de vida de un proceso: es prácticamente un estándar en todos los sistemas operativos. En principio el proceso no existe, es creado, luego pasa a listo (el proceso esta en condiciones
Más detallesTema 6. Reutilización de código. Programación 2015-2016. Programación - Tema 6: Reutilización de código
Tema 6 Reutilización de código Programación 2015-2016 Programación - Tema 6: Reutilización de código 1 Tema 6. Reutilización de código Modularidad. Implementación de métodos. Uso de métodos. Programación
Más detallesMensajes. Interbloqueo
CONCURRENCIA DE PROCESOS Preparado por: Angel Chata Tintaya (angelchata@hotmail.com) Resumen Los procesos comparten variables globales, comparten y compiten por recursos, se ejecutan simultáneamente intercalándose
Más detallesMICQ. Trabajo Práctico Final Seminario de Ingeniería en Informática I 75.35. Facultad de Ingeniería, UBA. Junio 2002. Cátedra: Pablo Cosso
MICQ Facultad de Ingeniería, UBA. Junio 2002 Trabajo Práctico Final Seminario de Ingeniería en Informática I 75.35 Cátedra: Pablo Cosso Alumno: Diego Fernando Montaldo 75.300 1 de 1 Introducción Este documento
Más detallesGESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)
APRENDERAPROGRAMAR.COM GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C) Sección: Cursos Categoría: Lenguaje de programación Java nivel avanzado I
Más detallesModelo de Objetos Distribuidos
Remote Method Invocation Modelo de Objetos Distribuidos Un objeto remoto es un objeto cuyos métodos pueden ser invocados desde otra máquina virtual de java, potencialmente en un host diferente. Modelo
Más detallesPráctico de Procesos, Hilos y Deadlock
Sistemas Operativos Práctico de Procesos, Hilos y Deadlock Universidad Nacional de Córdoba FaMAF Ejercicio 1.. Indique cuantas letras a imprime este programa, describiendo su funcionamiento. printf("a\n");
Más detallesAcronis License Server. Guía del usuario
Acronis License Server Guía del usuario TABLA DE CONTENIDO 1. INTRODUCCIÓN... 3 1.1 Generalidades... 3 1.2 Política de licencias... 3 2. SISTEMAS OPERATIVOS COMPATIBLES... 4 3. INSTALACIÓN DE ACRONIS LICENSE
Más detallesConcurrencia: Exclusión mutua y Sincronización
Concurrencia: Exclusión mutua y Sincronización Prof. Carlos Figueira Basado en materiales de Yudith Cardinale (USB) Williams Stallings, Eugene Styer Concurrencia Múltiples aplicaciones Aplicaciones estructuradas
Más detallesConcurrencia entre Procesos.
Concurrencia entre Procesos. Sistemas Operativos Tema 3. 1 Procesamiento concurrente. Procesamiento concurrente: base de los sistemas operativos modernos (multiprogramados): Un conjunto de procesos que
Más detallesPruebas de unidad con JUnit
Pruebas de unidad con JUnit Cuando se implementa software, resulta recomendable comprobar que el código que hemos escrito funciona correctamente. Para ello, implementamos pruebas que verifican que nuestro
Más detallesSistemas Operativos. Curso 2014 Planificación
Sistemas Operativos Curso 2014 Planificación Agenda Introducción. Despachador. Clases de procesos. Esquemas de planificación. Criterios de planificación. Algoritmos de planificación. FCFS. SJF. Prioridad.
Más detallesvoid main(void) { string lname; list <string> lnamelist; cout << "Please enter your list of last names finishing with `.`"<<endl;
Segundo Certamen 1.- Haga uso de la información adjunta y desarrolle un programa en C++ que lea apellidos de teclado y los almacene en una lista. Luego se pide listar los apellidos en orden alfabético
Más detallesSistemas Operativos. Curso 2015 Planificación
Sistemas Operativos Curso 2015 Planificación Agenda Introducción. Despachador. Clases de procesos. Esquemas de planificación. Criterios de planificación. Algoritmos de planificación. FCFS. SJF. Prioridad.
Más detallesEXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso 2010 2011. Cuatrimestre de otoño. 17 de Enero de 2011
EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso 2010 2011. Cuatrimestre de otoño. 17 de Enero de 2011 1. (0,75 PUNTOS) Identificad a continuación las sentencias que son ciertas, descartando
Más detallesConcurrencia en Java
Concurrencia en Java Concurrencia y Distribución Programación Avanzada Posgrado en Ciencia e Ingeniería de la Computación, UNAM 1. El mecanismo de threads Una aplicación Java o applet puede contener secciones
Más detallesPontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación
Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación Competencias IIC1103 Introducción a la Programación (I/2010) Interrogación 1 13 de Abril de 2010
Más detalles75-62 Técnicas de Programación Concurrente II 2004 java Threads
75-62 Técnicas de Programación Concurrente II 2004 java Threads FIUBA Ing. Osvaldo Clúa Bibliografía: tutorial de Java en http://java.sun.com Un buen libro (algo teórico) es Garg: Concurrent and Distributed
Más detallesRepaso de las características más importantes de la programación Java y su adaptación a Android
Repaso de las características más importantes de la programación Java y su adaptación a Android 1. Entorno de programación en java 2. Variables y tipos de datos 3. Operaciones y operadores 4. Clases y
Más detallesIntroducción a la Firma Electrónica en MIDAS
Introducción a la Firma Electrónica en MIDAS Firma Digital Introducción. El Módulo para la Integración de Documentos y Acceso a los Sistemas(MIDAS) emplea la firma digital como método de aseguramiento
Más detalles1 (2 5 puntos) Responda con brevedad y precisión a las siguientes preguntas:
Universidad de Las Palmas de Gran Canaria Escuela Universitaria de Informática Facultad de Informática Sistemas Operativos Examen parcial, 11 de mayo de 2002 SOLUCIONES Calificación 1 2 3 4 5 1 (2 5 puntos)
Más detallesCreación de Funciones de Conducción
Creación de Funciones de Conducción Requerimientos Para el desarrollo de esta actividad se requiere que: Contemos con un robot BoeBot armado con placa Arduino. Repetición En estos momentos habremos notado
Más detallesElementos requeridos para crearlos (ejemplo: el compilador)
Generalidades A lo largo del ciclo de vida del proceso de software, los productos de software evolucionan. Desde la concepción del producto y la captura de requisitos inicial hasta la puesta en producción
Más detallesIntroducción a la programación orientada a objetos
Introducción a la programación orientada a objetos 1. Introducción a la programación orientada a objetos 2. Las clases 3. El tipo Struct 4. Diferencias entre Class y Struct 5. Pilares de la Programación
Más detallesGestión de Oportunidades
Gestión de Oportunidades Bizagi Suite Gestión de Oportunidades 1 Tabla de Contenido CRM Gestión de Oportunidades de Negocio... 4 Elementos del Proceso... 5 Registrar Oportunidad... 5 Habilitar Alarma y
Más detallesConcurrencia: deberes. Concurrencia: Exclusión Mutua y Sincronización. Concurrencia. Dificultades con la Concurrencia
Concurrencia: deberes Concurrencia: Exclusión Mutua y Sincronización Capítulo 5 Comunicación entre procesos Compartir recursos Sincronización de múltiples procesos Asignación del tiempo de procesador Concurrencia
Más detallesSISTEMAS OPERATIVOS AVANZADOS
SISTEMAS OPERATIVOS AVANZADOS TEMA 3 CLAVE: MIS 204 PROFESOR: M.C. ALEJA DRO GUTIÉRREZ DÍAZ 3. PROCESOS CONCURRENTES 3.1 Conceptos de programación concurrente 3.2 El problema de la sección crítica 3.3
Más detallesFUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005
Dpto. de Ingeniería de Sistemas Telemáticos E.T.S.I. Telecomunicación Universidad Politécnica de Madrid FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005 Normas de examen: Con libros y apuntes Duración: 2 horas
Más detallesThreads o Hilos. Marco Besteiro y Miguel Rodríguez
En.NET, cuando se lanza una aplicación se crea un proceso y dentro de este proceso un hilo de ejecución o thread para el método Main. Es posible, a la vez que se ejecuta el método Main, que la aplicación
Más detallesManual del Protocolo XML-RPC de Mensajería Negocios
Manual del Protocolo XML-RPC de Mensajería Negocios Índice de contenidos 1 INTRODUCCIÓN... 3 2 FUNCIONALIDADES DEL API DE COMUNICACIÓN XML-RPC... 4 2.1 Envío Libre... 4 2.2 Envío a Grupo de Contactos...
Más detallesProgramación Concurrente en Java
Programación Concurrente en Java Curso 2006-2007 9/2/2007 Prog. Distribuida Bajo Internet Qué es la Programación Concurrente? Diseño basado en varias actividades independientes Conceptualmente se ejecutan
Más detallesSOLUCION PARCIAL TASK SCHEDULER. Task Scheduler
Task Scheduler Se necesita modelar una aplicación que permita definir tareas y ejecutarlas en forma programada. Las tareas pueden ser: La ejecución de programa cualquiera o comando del sistema operativo,
Más detallesHilos, comunicación y competencia entre procesos. Dr. Alonso Ramírez Manzanares 2-Sep-2010
Hilos, comunicación y competencia entre procesos Dr. Alonso Ramírez Manzanares 2-Sep-2010 Implementación de procesos Se mantiene una tabla de procesos con una entrada por cada proceso: Con lo cual tenemos
Más detalles2.2.- Paradigmas de la POO
2.2.- Paradigmas de la POO Los principios propios de la orientación a objetos son: 2.2.1.- Abstracción de Datos 2.2.2.- Encapsulamiento 2.2.3.- Ocultamiento 2.2.4.- Herencia 2.2.5.- Polimorfismo Cualquier
Más detallesEstructura de datos tipo vector.
Estructura de datos tipo vector. Hemos empleado variables de distinto tipo para el almacenamiento de datos (variables int, float, String) En esta sección veremos otros tipos de variables que permiten almacenar
Más detallesSistemas Operativos. Curso 2016 Procesos
Sistemas Operativos Curso 2016 Procesos Agenda Proceso. Definición de proceso. Contador de programa. Memoria de los procesos. Estados de los procesos. Transiciones entre los estados. Bloque descriptor
Más detalles2. Estructura de un programa en Java
24 A. García-Beltrán y J.M. Arranz 2. Estructura de un programa en Java Objetivos: a) Describir la estructura del código fuente de una aplicación Java b) Presentar los conceptos de comentario y de identificador
Más detallesPUESTA EN MARCHA PROGRAMA GESTION DE OPTICAS. Junio - 2004
PUESTA EN MARCHA PROGRAMA GESTION DE OPTICAS Junio - 2004 pmqsoft Servicios Informáticos, S.L. www.pmqsoft.com soporte@pmqsoft.com Entendiendo que la instalación ha finalizado y que todo ha salido correctamente.
Más detallesEXCEPCIONES EN JAVA. Las sentencias que tratan las excepciones son try y catch. La sintaxis es:
EXCEPCIONES EN JAVA Uno de los problemas más importantes al escribir aplicaciones es el tratamiento de los errores. Errores no previstos que distorsionan la ejecución del programa. Las excepciones de Java
Más detallesRegión de Murcia Consejería de Educación, Ciencia e Investigación. Manual Usuario FCT
. Manual Usuario FCT Murcia, 9 de Julio de 2007 Manual de Usuario FCT v1.0 pág. 2 de 73 ÍNDICE Manual Usuario FCT...1 1. Tipos de usuarios... 4 2. Modelo de navegación... 5 3. Servicios... 6 3.1. Convenios...
Más detallesIntroducción a Java LSUB. 15 de enero de 2015 GSYC
Introducción a LSUB GSYC 15 de enero de 2015 (cc) 2014 Laboratorio de Sistemas, Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento - NoComercial - SinObraDerivada
Más detallesProgramación Concurrente y Paralela. P(S) ; sección crítica P(S);
2.5.2 Monitores Los semáforos, a pesar de su sencillez de uso, son el equivalente a las instrucciones goto y el manejo de apuntadores en los lenguajes de programación imperativos: son muy susceptibles
Más detallesPreliminares. Tipos de variables y Expresiones
Preliminares. Tipos de variables y Expresiones Felipe Osorio Instituto de Estadística Pontificia Universidad Católica de Valparaíso Marzo 5, 2015 1 / 20 Preliminares Computadoras desarrollan tareas a un
Más detallesConcurrencia. Bibliografía: Introducción a los Sistemas de Bases de Datos Date, C.J.
Concurrencia Bibliografía: Introducción a los Sistemas de Bases de Datos Date, C.J. Concurrencia La mayor parte de los DBMS son sistemas para múltiples usuarios Se permite a cualquier cantidad de transacciones
Más detallesSolución al Examen de Prácticas de Programación (Ingeniería Informática)
Solución al Examen de Prácticas de Programación (Ingeniería Informática) Junio 2006 Parte I. Cuestiones (3 puntos=50% nota del examen) 1) Se desea crear un conjunto de clases para representar en un programa
Más detallesMonitores Ing. Iván Medrano Valencia
Universidad Nacional de San Antonio Abad del Cusco Departamento Académico de Informática Programación Concurrente y Distribuida Práctica 5 1. OBJETIVO. Ing. Iván Medrano Valencia En esta práctica, comprobaremos
Más detallesQ-flow Patrones básicos de Workflow
How to Q-flow Patrones básicos de Workflow Versión: 2.0 Fecha de publicación 28-03-2011 Aplica a: Q-flow 3.0 y Q-flow 3.1 Índice Introducción... 3 Patrones de control... 4 Patrón: Secuencia... 4 Patrón:
Más detallesHilos en Java. Crear un Hilo. Detener un hilo. Fuente: http://www.chuidiang.com/java/hilos/hilos_java.php
Fuente: http://www.chuidiang.com/java/hilos/hilos_java.php Hilos en Java A veces necesitamos que nuestro programa Java realice varias cosas simultáneamente. Otras veces tiene que realizar una tarea muy
Más detallesManual de Palm BlueChat 2.0
Manual de Palm BlueChat 2.0 Copyright 2002 Palm, Inc. Todos los derechos reservados. Graffiti, HotSync y Palm OS son marcas registradas de Palm, Inc. El logotipo de HotSync, Palm y el logotipo de Palm
Más detallesIngeniería del Software Arquitectura Física en 3 niveles
Introducción En este laboratorio desplegaremos en 3 niveles físicos una aplicación que verifica si una cuenta y un password son correctos, basada en la que fue presentada en el laboratorio Separación entre
Más detallesReceta general para resolver problemas de sincronización con semáforos
Receta general para resolver problemas de sincronización con semáforos La primera vez que te enfrentas a la tarea de implementar una solución a un problema de sincronización entre procesos, es normal que
Más detallesIntroducción - por qué usarlas?(1)
Excepciones en Java Introducción - por qué usarlas?(1) En el mundo de la programación hay algo que siempre ocurre: los errores en los programas. Pero qué sucede realmente después de que ha ocurrido el
Más detallesProgramación Orientada a Objetos en Java
Programación Orientada a Objetos en Java Curso 2006-2007 Tema 4 Herencia y Polimorfismo Gonzalo Méndez Pozo Dpto. de Ingeniería de Software e Inteligencia Artificial Universidad Complutense de Madrid Herencia
Más detallesIntroducción a la Programación Orientada a Objetos
Introducción a la Programación Orientada a Objetos El paradigma imperativo. En un programa se tienen una serie de variables con las cuales operamos y modificamos mediante sentencias y funciones para producir
Más detallesPHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases
PHP y MySQL Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases Herencia de Objetos La herencia permite crear muchas clases que son similares entre si, sin tener
Más detallesSensor de Temperatura utilizando el Starter Kit Javelin Stamp. Realizado por: Bertha Palomeque A. Rodrigo Barzola J.
Sensor de Temperatura utilizando el Starter Kit Javelin Stamp Realizado por: Bertha Palomeque A. Rodrigo Barzola J. INTRODUCCION DIFERENCIAS EJEMPLOS JAVA Orientado a Objetos Multiplataforma Programar
Más detallesGestión de la Configuración
Gestión de la ÍNDICE DESCRIPCIÓN Y OBJETIVOS... 1 ESTUDIO DE VIABILIDAD DEL SISTEMA... 2 ACTIVIDAD EVS-GC 1: DEFINICIÓN DE LOS REQUISITOS DE GESTIÓN DE CONFIGURACIÓN... 2 Tarea EVS-GC 1.1: Definición de
Más detallesObjetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor.
Sesión 03: Lenguajes web del servidor Competencias a Conseguir: - Conocer el entorno de trabajo a nivel de servidores web. - Instalación del localhost (Servidor Local). - Repaso general de PHP y ejercicios
Más detallesExamen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1
Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1.1 Ejercicio 1: Máquina Expendedora (3.5 ptos.)... 1 1.2 Ejercicio 2: Clase Circulo (1.0 pto.)... 3 1.3 Ejercicio
Más detallesMANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD
MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD Fecha última revisión: Diciembre 2010 Tareas Programadas TAREAS PROGRAMADAS... 3 LAS TAREAS PROGRAMADAS EN GOTELGEST.NET... 4 A) DAR DE ALTA UN USUARIO...
Más detallesVisual Basic 1. Empleo de módulos y Procedimientos. Procedimientos definidos por el usuario
Empleo de módulos y Procedimientos Procedimientos definidos por el usuario Según lo que hemos visto hasta ahora, Visual Basic, almacena el código en módulos. Hay tres clases de módulos: formularios (.frm),
Más detallesMANUAL DE USUARIO SISTEMA DE ALMACEN DIF SONORA
MANUAL DE USUARIO SISTEMA DE ALMACEN DIF SONORA DICIEMBRE 2007. El Sistema de Almacén fue desarrollado con la finalidad de facilitar a los usuarios el proceso de entradas y salidas del almacén mediante
Más detallesCurso de Python Inicial
Logo IAA-CSIC Curso organizado por el Gabinete de Formación del CSIC Curso de Python Inicial Clases Contenidos 1. Paradigmas de la Programación 2. Programación Orientada a objetos 3. Clases 4. Objetos
Más detallesSistemas operativos avanzados. 1.3 Algoritmos de planificación del procesador
Sistemas operativos avanzados 1.3 Algoritmos de planificación del procesador Parámetros Cuando tenemos más de un proceso en condiciones de ejecutar, debemos escoger uno de entre ellos. Para escogerlo empleamos
Más detallesdit UPM Tema 3: Concurrencia /ejercicios Análisis y diseño de software José A. Mañas 3.4.2014 http://jungla.dit.upm.es/~pepe/doc/adsw/index.
Análisis y diseño de software dit UPM Tema 3: Concurrencia /ejercicios José A. Mañas http://jungla.dit.upm.es/~pepe/doc/adsw/index.html 3.4.2014 ejercicio 1.1 programar una cuenta bancaria compartida 1.
Más detalles3.9 Patrón Distributed callback
3.9 Patrón Distributed callback Motivación (1) Queremos que la aplicación de administración de los termostatos Monitorize la temperatura de algunos termostatos, avisándonos si ésta baja o sube por encima
Más detallesDefinición de clases: Herencia, polimorfismo, ligadura dinámica
Tema 7 Definición de clases: Herencia, polimorfismo, ligadura dinámica Con alguna frecuencia es necesario definir clases de objetos entre las cuales hay elementos comunes. En una aplicación en la cual
Más detallesEn cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.
Arboles-B Características Los árboles-b son árboles de búsqueda. La "B" probablemente se debe a que el algoritmo fue desarrollado por "Rudolf Bayer" y "Eduard M. McCreight", que trabajan para la empresa
Más detallesClases abstractas e interfaces
Clases abstractas e interfaces Clases abstractas Una clase abstracta es una clase que no se puede instanciar se usa únicamente para definir subclases Cuándo es una clase abstracta? En cuanto uno de sus
Más detallesINTRODUCCION A LA PROGRAMACION DE PLC
INTRODUCCION A LA PROGRAMACION DE PLC Esta guía se utilizará para estudiar la estructura general de programación de um PLC Instrucciones y Programas Una instrucción u orden de trabajo consta de dos partes
Más detallesManual Oficina Web de Clubes (FBM)
Manual Oficina Web de Clubes (FBM) INTRODUCCIÓN: La Oficina Web de Clubes de Intrafeb es la oficina virtual desde la que un club podrá realizar las siguientes operaciones durante la temporada: 1. Ver información
Más detallesMensajes. (versión preliminar)
Mensajes (versión preliminar) Ejemplo: productor/consumidor con buffer de tamaño 0 void produce(item *p_it); void consume(item *p_it); int nmain() { ntask cons= nemittask(consproc); ntask prod= nemittask(prodproc,
Más detallesPROCEDIMIENTO DE GESTIÓN PARA NOMBRES DE DOMINIO Y CONTACTOS EN.CL
PROCEDIMIENTO DE GESTIÓN PARA NOMBRES DE DOMINIO Y CONTACTOS EN.CL Este documento establece el procedimiento de gestión para Nombres de Dominio y Contactos en.cl, el cual forma parte de la Reglamentación
Más detalles