Programación concurrente y semáforos en Java

Documentos relacionados
Arquitecturas cliente/servidor

PROGRAMACIÓN EN JAVA

Benemérita Universidad Autónoma del Estado de Puebla

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

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Benemérita Universidad Autónoma del Estado de Puebla

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

Ficheros de acceso aleatorio

Programación Concurrente en Java

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Lenguaje de programación con JAVA

5. Sentencias selectivas o condicionales

Programación Concurrente en Java

Práctica 4: Herencia. Objetivos:

Tipos DataInputStream/DataOutputStream: L/E de datos de tipo simple y Cadenas (Strings) ObjectInputStream/ObjectOutputStream: para persistencia de obj

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Hebras y Sincronización en Java

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Práctica III: Streams, Readers y Writers

FACULTAD DE INGENIERÍA

Modulo 1 El lenguaje Java

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

1 HILOS (THREADS) EN JAVA

Guía - Taller # 2 (JAVA)

Multitarea en Java. Rafa Caballero - UCM

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

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

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

PROGRAMACION DISTRIBUIDA

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Concurrencia en Java

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

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

2. Estructura de un programa en Java

Java: Programación Multithread

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

Secretos de la Programación Concurrente

Concurrencia en Java

Lección 2: Creando una Aplicación en Java. 1. Estructura del archivo de una clase. 3. Definiendo clases fundamentos

Sensor de Temperatura utilizando el Starter Kit Javelin Stamp. Realizado por: Bertha Palomeque A. Rodrigo Barzola J.

Concurrencia. Primitivas IPC con bloqueo

Federico Peinado

Programación Orientada a Eventos

Tema 4. Excepciones en Java

Los caracteres de Java pueden agruparse en letras, dígitos, espacios en blanco, caracteres especiales, signos de puntuación y secuencias de escape.

Introducción al lenguaje Java

Ficha de Aprendizaje N 13

Entrada y Salida con Java

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.

FUNDAMENTOS DE INFORMÁTICA

Programación Orientada a Objetos. Tema 7: Persistencia

Elementos léxicos del lenguaje de programación Java

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

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

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

APUNTES JAVA ARRAYS (ARREGLOS) Un arreglo es un grupo de posiciones de memoria contiguas. Todas las cuales tienen el mismo nombre y el mismo tipo.

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

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

INTRODUCCION A LA PROGRAMACION EN JAVA

Monitores Ing. Iván Medrano Valencia

1 ELEMENTOS BASICOS DEL LENGUAJE

Definición de Memoria

Programación I Unidad III. Tema: Tipos, estructuras y uniones

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

Tema 2. El lenguaje JAVA

Ficheros y streams. Desde el punto de vista de Java, cada fichero no es más que una secuencia o flujo de bytes [stream].

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

Programas. Los programas más simples escritos en lenguajes imperativos suelen realizar tres tareas de forma secuencial:

Flujos (streams) Programación. Licenciatura Lingüística y Nuevas Tecnologias Nadjet Bouayad-Agha

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

El lenguaje C. 1. Identificadores, constantes y variables

Clases. Java: Clases y Objetos. Clases. Clases. Modificadores de clase. Definición de una clase. Cada objeto es un ejemplar de una clase

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

Programa Java. El lenguaje de programación Java. Comentarios. Programa Java. Palabras reservadas. Identificadores

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

Curso Introducción JAVA Pág.: 1

Arquitecturas cliente/servidor

Java para programadores

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

El lenguaje de Programación C. Fernando J. Pereda

Manual de turbo pascal

Objetivo de aprendizaje del tema

James Gosling, creador de Java

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

EJEMPLOS PROGRAMACIÓN SOCKET - JAVA

PROGRAMACION CONCURRENTE

Introduciendo datos desde el

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

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

Sockets. Los sockets son un mecanismo de comunicación entre procesos que se utiliza en Internet.

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

Práctica 5: Common Object Request Broker Architecture CORBA

Arreglos Unidimensionales En este tipo de arreglo se hace uso de un índice solamente para hacer referencia a una posición particular del arreglo.

4. Operadores Operador asignación

JAVA - Serializacíon / RMI. (C) Philippe Roose , 2005

Sockets en Java. Prof. Wílmer Pereira Universidad Simón Bolívar

Introducción al lenguaje de programación java

Transcripción:

Programación concurrente y semáforos en Java En Java es posible ejecutar tareas en paralelo, utilizando hebras de control (hilos, threads). Este modo de programación permite tener un espacio de memoria, código o recursos compartidos. Tiene la ventaja que su ejecución resulta más económica que un proceso completo.

Semáforos Java cuenta con semáforos implícitos de la forma: Object mutex = new Object(); /* */ Synchonized (mutex){ /* */ Que solo pueden ser utilizados para exclusión mutua. Solo una hebra de control puede ejecutarse en el bloque synchonized en un momento dado.

Ejemplo del uso de la palabra Synchonized import java.io.*; class Banco { public static void main ( String args[]) { try { // Declaramos los dos montones de billetes Contador co1 = new Contador (); Contador co2 = new Contador (); // Declaramos los dos cajeros Cajero c1 = new Cajero(co1); Cajero c2 = new Cajero(co2); // Se ponen a contar.. c1.start(); c2.start(); c1.join(); c2.join(); catch ( Exception e ){ e.printstacktrace();

Clase Contador: Cuenta billetes y almacena la suma class Contador { int numbilletes = 0 ; long suma = 0 ; final int TOTAL_BILLETES = 10000 ; final int VALOR_BILLETES = 200 ; void cuenta () { // A contar la suma de los billetes for ( numbilletes =0 ; numbilletes < TOTAL_BILLETES; numbilletes ++ ) { suma += VALOR_BILLETES ; // Billetes de 200 pesos Thread.yield(); System.out.println ( numbilletes+ " suman : "+ suma + " pesos");

Clase Cajero: Recibe cierta cantidad de billetes para contar class Cajero extends Thread { Contador contadorcajero ; Cajero ( Contador paramcontador ) { contadorcajero = paramcontador ; public void run () { contadorcajero.cuenta();

Resultado: 10000 suman 2000000 pesos 10000 suman 2000000 pesos Es correcto, dado que cada cajero tiene su cantidad de billetes para contar.

Compartiendo el recurso Ahora supongamos que los dos cajeros deben contar del mismo montón, o sea, lo comparten y por tanto, la suma de lo que haya contado cada uno debe ser el resultado total. Para ello, modificaremos el código añadiendo lo siguiente Declaramos los dos montones de billetes : Contador co1 = new Contador (); // Ahora sobra, Contador co2 = new Contador (); // Declaramos los dos cajeros y el mismo montón. Cajero c1 = new Cajero(co1); Cajero c2 = new Cajero(co1); Con este cambio obtenemos: 10000 suman: 2000200 pesos 10001 suman: 2000200 pesos

El resultado anterior es incorrecto Por tanto, debemos utilizar un mecanismo de sincronización que garantice que cuando un cajero cuente un billete y lo sume, el otro no pueda intentar coger el mismo billete y sumarlo. La solución que ofrece Java para resolver este problema es de lo más simple y eficiente, utilizando la cláusula synchronized en la declaración del método donde se realiza la tarea "crítica". Por tanto, cambiaremos el método void cuenta() por: synchronized void cuenta ()

Si realizamos ese cambio, obtenemos el siguiente resultado: 10000 suman : 2000000 pesos 10000 suman : 4000000 pesos Esto ocurre porque no se inicializa la variable suma antes del ciclo que cuenta los billetes, por lo que el segundo cajero continúa la suma en donde la dejó el anterior.

Inicializando el contador dentro de cada Si modificamos el código e incluimos la inicialización, tendremos: void cuenta () { // Cada cajero cuenta lo suyo suma = 0 ; // A contar la suma de los billetes for ( numbilletes =0 ; numbilletes < TOTAL_BILLETES ;numbilletes ++ ) { suma += VALOR_BILLETES ; Thread.yield(); A partir de este momento obtenemos el siguiente resultado esperado tal y como detallamos: 10000 suman : 2000000 pesos 10000 suman : 2000000 pesos

Otra forma de realizar la sincronización consiste en declarar el objeto compartido como sincronizado en vez del método que lo contiene. Se realiza entonces el siguiente cambio: public void run(){ contadorcajero.cuenta(); por: public void run(){ synchronized (contadorcajero ) { contadorcajero.cuenta();

Regiones Críticas Aún cuando los semáforos representan una solución sencilla para la sincronización de procesos concurrentes, no son una solución definitiva Debido al anidamiento de secciones críticas tienden a dificultar su uso y a generar complejos protocolos. La solución propuesta es el uso de regiones críticas. Desarrolladas por C.A.R. Hoare y P. Brinch Hansen.

Regiones críticas Las regiones críticas son una extensión al uso de semáforos. Ahora la región crítica representa el código donde se accede al recurso compartido, y se colocan en una zona fuera del programa. La notación propuesta por Hoare es: Se compone por una variable compartida o recurso v y la región crítica C With v do C

Monitores El siguiente nivel dentro de la solución a los problemas de exclusión mutua y sincronización entre procesos concurrentes fue desarrollado por C.A.R. Hoare y P. Brinch Hansen. Ahora se considera como recurso compartido no únicamente las variables compartidas, sino también a los procedimientos y funciones que actúan sobre las variables

Seudocódigo Notación propuesta por Hoare (Simula 67) monitorname: monitor begin //declaraciones de datos locales del monitor procedure //procname { parametros formales // cuerpo del procedimiento begin // otros procedimiento locales del monitor end.. //inicialización de los datos locales del monitor end

Monitores Productor Monitor (recurso compartido) Consumidor

Ejemplo

:TubTest t:tuberia p:productor c:consumidor new Tuberia() new Productor(t) new Consumidor(t) estavacia == false siguiente++ estallena==false siguiente-- estavacia == false siguiente++ start( ) lanzar(c ) recoger(c ) lanzar(c ) run( ) sleep( ) start( ) run( ) sleep( )

:TubTest t:tuberia p:productor c:consumidor new Tuberia() new Productor(t) new Consumidor(t) (estavacia==true)? start( ) lanzar(c ) recoger(c ) wait() run( ) sleep( ) start( ) run( ) estavacia== false lanzar(c ) notify() estallena==false siguiente-- sleep( )

Lectura y Escritura de Archivos import java.io.bufferedinputstream; import java.io.bufferedoutputstream; import java.io.fileinputstream; import java.io.fileoutputstream; public class LecturaEscrituraArchivos { public static void main(string args[]){ copiaarchivo("c:/archivoentrada.txt", "c:/archivosalida.txt");

public static void copiaarchivo (String archivolectura, String archivoescritura){ try{ FileInputStream fileinput = new FileInputStream(archivoLectura); BufferedInputStream bufferedinput = new BufferedInputStream(fileInput); FileOutputStream fileoutput = new FileOutputStream(archivoEscritura); BufferedOutputStream bufferedoutput = new BufferedOutputStream(fileOutput); byte [] array = new byte [1]; int leidos= bufferedinput.read(array); while(leidos > 0){ bufferedoutput.write(array); leidos=bufferedinput.read(array); bufferedinput.close(); bufferedoutput.close(); catch(exception e){ e.printstacktrace();

RandomAccessFile Mediante los objetos de esta clase utilizamos archivos binarios mediante un acceso aleatorio, tanto para lectura como para escritura. Existe un índice que nos indica en qué posición del archivo nos encontramos, y con el que se puede trabajar para posicionarse en el archivo. RandomAccessFile(String nombre, String modo) nombre: cadena identificadora del archivo modo: si será de lectura y/o escritura

Ejemplo de algunos métodos de escritura La escritura del archivo se realiza con una función que depende el tipo de datos que se desee escribir. void write( byte b[], int ini, int len ); Escribe len caracteres del vector b. void write( int i ); Escribe la parte baja de i (un byte) en el flujo. void writeboolean( boolean b ); Escribe el boolean b como un byte. void writebyte( int i ); Escribe i como un byte. void writebytes( String s ); Escribe la cadena s tratada como bytes, no caracteres. void writechar( int i ); Escribe i como 1 byte. void writechars( String s ); Escribe la cadena s. void writedouble( double d ); Convierte d a long y le escribe como 8 bytes. void writefloat( float f ); Convierte f a entero y le escribe como 4 bytes. void writeint( int i ); Escribe i como 4 bytes. void writelong( long v ); Escribe v como 8 bytes. void writeshort( int i ); Escribe i como 2 bytes. void writeutf( String s ); Escribe la cadenas UTF Para la lectura existen métodos análogos para leer cada uno de los tipos de datos.