Ejercicio Java GeneraNumero/PresentaNumero. Solucion 2

Para esta solución, cumplimos con las normas de orientación a objetos trasladando las responsabilidades a sus clases.

En efecto, quien tiene la responsabilidad de mantener la integridad de datos, es nuestra clase buffer, por lo que ella se deberá encargar de todo el control de sincronización.

Deberemos modificar el get y el set, haciéndolos synchronized y controlado la integridad, por lo que queda así:

Lo único que hemos hecho es trasladar los bucles de espera a los métodos get y set, y gestionar las esperas sobre este objeto (this.wait(), this.notifyAll())

Es muy importante que recordéis el lanzar el notifyAll() antes de realizar el return, ya que de otra manera, los demás hilos que estuvieran en wait, quedarían esperando por siempre….

La clase GeneraNumero

Dado que la sincronización la soporta Buffer, esta clase no se tiene que preocupar de nada

La clase PresentaNumero

Lo mismo para esta clase

Y por último, la clase Main, no es necesario modificarla. La dejamos tal y como estaba antes:

Igual que lo comentado para la solucion1, dado que no hemos previsto la finalización, deberemos abortar el programa cuando queramos. En eclipse lo hariamos asi:

 

Publicado en Formacion, Java | Deja un comentario

Ejercicio Java GeneraNumero/PresentaNumero. Solucion 1

La primera solución puede que sea la más intuitiva, en la segunda respetaremos más las normas de la orientación a objetos.

Necesitamos crear una clase para intercambiar la información; nuestra clase deberá tener una variable para guardar el número, y otra para indicar si ya está generado, y ya ha sido utilizado. Esta podría ser una solución Sigue leyendo

Publicado en Formacion, Java | Deja un comentario

Java para programadores (6.5): Multitarea. java.util.concurrent

Paquete añadido en Java 5, que contiene un conjunto de clases para hacer más fácil el desarrollo de aplicaciones concurrentes

Se trata de una biblioteca que contiene estructuras de datos y clases que proporcionen seguridad de hilos e interfaces que ayudan a normalizar los procesos multi-hilo. Sigue leyendo

Publicado en Formacion, Java | Deja un comentario

Java para programadores (6.5): Multitarea. Monitores

Todos los objetos disponen de un monitor interno, que solo permite el acceso de un hilo a la vez

Que son los monitores

  • Estructura de alto nivel para la gestión de concurrencia
  • El monitor sólo permite el acceso a un hilo a la vez
  • Contiene una lista priorizada de hilos en espera para entrar
  • Gestiona dicho acceso

Sigue leyendo

Publicado en Formacion, Java | Deja un comentario

Java para programadores (6.5): Multitarea. synchronized()

Si varios hilos pueden compartir atributos, puede ser necesario sincronizarlos.

La sincronización, garantiza que a un objeto concreto, solo puede ser accedido por un hilo. En un momento determinado

Podemos sincronizar métodos declarándolos synchronized

  • En un momento determinado, solo puede estar corriendo un método synchronized

Veamos este ejercicio en donde la clase Runnable comparte un contador estático, por lo que todas las instancias tienen la misma información. La clase da 10 vueltas, imprimiendo el contador y sumando uno

Ejemplo en Java de synchronized()

Y su Main

Java. synchronized()

El resultado será:

Como habíamos comprobado antes, el orden de ejecución de los hilos es aleatorio, y a veces, uno puede incluso dar dos vueltas, pero el otro también interfiere, por eso los números aparecen duplicados.

Veamos qué pasa si utilizamos clases sincronizadas, para ello nuestra Runnable es

Y nuestra nueva Main

 

 

Lo que hemos hecho en la clase Sincro, es declarar un bloque de instrucciones, de la 13 a la 23 como sincronizadas, por lo que, hasta que no acaben, no se podrá acceder al objeto “n”

Esto hace que ahora la salida sea

En donde se han ejecutado las 10 vueltas de un hilo, y luego, se han ejecutado las 10 del otro

Las cosas están más claras, pero…uno de los hilos ha tenido que esperar a que el otro terminara. Si nuestro problema está únicamente en el comportamiento del contador, podemos sincronizar únicamente la impresión y modificaciones de ese contador

Modificamos Sincro

Y en la nueva salida veremos que el otro hilo, solo ha tenido que esperar que se imprimiera y modificara la variable, y después, ya ha podido entrar él, para hacer lo mismo. La salida será:

Publicado en Formacion, Java | Deja un comentario

Java para programadores (6.5): Multitarea. Runnable

La segunda forma de crear instancias concurrentes, es implementando la interface Runnable.

Esta interface, nos obliga a implementar el método run () igual que antes, con lo que luego podremos utilizar la clase Thread para lanzar la ejecución

Vamos a escribir una clase que escriba 100 veces un mensaje, y como queremos que corra como un hilo, daremos las órdenes en el método run (). Veremos que es idéntica a la anterior, pero en lugar de extender Thread, implementa Runnable Sigue leyendo

Publicado en Formacion, Java | Deja un comentario

Java para programadores (6.5): Multitarea. Thread

La primera forma que veremos para crear clases concurrentes es extendiendo Thread

Deberemos sobrecargar el método run() en donde indicaremos lo que queremos hacer.

Vamos a escribir una clase que escriba 100 veces un mensaje, y cómo queremos que corra como un hilo, daremos las órdenes en el método run() Sigue leyendo

Publicado en Formacion, Java | Deja un comentario

Java para programadores (6.5): Multitarea. Conceptos

La multitarea nos permite dividir el flujo del programa en distintas partes que pueden correr a la vez, de forma síncrona o asíncrona.

Podremos aplicar la multitarea cuando haya varias acciones a realizar y cada una sea independiente de la otra, de tal forma que la realización de una, no dependa de ninguna otra Sigue leyendo

Publicado en Formacion, Java | Deja un comentario

Java para programadores (6.5): Multitarea

Un ordenador dispone de demasiada potencia para desaprovecharla haciendo un solo proceso. En muchas ocasiones, podremos lanzar procesos solapados, y habrá otras en que deberemos mantener más de un proceso trabajando en distintas áreas.

En este apartado, vamos a revisar cómo podemos lanzar varios trabajos a la vez y, si nos interesa, como podemos comunicarnos con ellos.

Publicado en Formacion, Java | Deja un comentario

Ejercicios Java. Trabajando con ficheros

Vamos a realizar un ejercicio acercade como tratar un fichero con Java; teneis la materia explicada en:

http://recursosformacion.com/wordpress/2018/03/java-programadores-8-1-acceso-datos-trabajar-ficherosjava-io/

http://recursosformacion.com/wordpress/2018/03/java-programadores-8-2-acceso-datos-codificaciones/

http://recursosformacion.com/wordpress/2018/03/java-programadores-8-3-acceso-datos-paquete-java/

Y aqui podeis encontrar alguna explicación acerca de como recibir datos desde el teclado.

http://recursosformacion.com/wordpress/2017/11/java-programadores4-6c-entradas-desde-teclado/

Ejercicio

Escribir una clase ConsolaToDisk que pida por consola la ruta completa del fichero a grabar; compruebe que no exista, si existe, ha de repetir la petición hasta que le indiquen un nombre inexistente.

Si el nombre de fichero se deja en blanco, se cierra el programa.

A continuación, que empiece a solicitar líneas por teclado, y las vaya grabando en el fichero de salida, hasta que reciba una línea en blanco, momento en que finalizara el programa.

Se debe utilizar Scanner, Files, y Path

Sigue leyendo

Publicado en Formacion, Java | Deja un comentario