Programación Concurrente en Java - Hebras y monitores
Transcript of Programación Concurrente en Java - Hebras y monitores
![Page 1: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/1.jpg)
Programacion Concurrente en Java
Hebras y monitores
Luis Fernando Llana Dıaz
Departamento de Sistemas Informaticos y Programacion
Universidad Complutense de Madrid
21 de marzo de 2006
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 2: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/2.jpg)
Threads
Extendiendo la clase java.lang.Thread.
28public class PrThread extends Thread{
29public PrThread(String s) {
30super(s);
31}
32public final void run() {
33boolean sigue=true;
34for (int i=0; i<100 && sigue; i++) {
35try {
36System.out.println(getName ()+":"+i);
37sleep (20);
38} catch (InterruptedException e) {
39System.out.println(getName ()+" interrumpida");
40sigue=false;
41}
42}
43}
44public static final void main(final String [] args ){
45Thread p = new PrThread("mia");
46p.start ();
47}
48}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 3: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/3.jpg)
Threads
Implementado el interfaz java.lang.Runnable.
26public class PrRunnable implements Runnable {
27public final void run() {
28Thread hebra = Thread.currentThread ();
29boolean sigue=true;
30for (int i=0; i<100 && sigue; i++) {
31try {
32System.out.println(hebra.getName ()+":"+i);
33hebra.sleep (20);
34} catch (InterruptedException e) {
35System.out.println(hebra.getName ()+" interrumpida");
36sigue=false;
37}
38}
39}
40public static final void main(final String [] args) {
41Thread p = new Thread(new PrRunnable (),"mia");
42p.start ();
43}
44}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 4: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/4.jpg)
Ciclo de vida de una hebra
Tras crear una hebra y se ejecuta el metodo start, la hebra puedeestar:
1 En ejecucion.
2 Suspendida: ha ejecutado sleep, join, wait.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 5: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/5.jpg)
Parar una hebra
Usar el metodo interrupt
1public static void ex1() throws InterruptedException {
2Thread h = new PrThread("1");
3h.start ();
4Thread.sleep (100);
5h.interrupt ();
6System.out.println(h.isInterrupted ());
7}
Metodos Deprecated: stop, suspend, resume.Una hebra para cunado esta Not Runnnable, ha ejecutado sleep,join, wait.Pueden lanzar InterruptedException, la hebra decide si para osigue.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 6: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/6.jpg)
Esperamos a que una hebra acabe
Metodo: join
1public static void ex2() throws InterruptedException {
2Thread h1 = new PrThread("1");
3Thread h2 = new PrThread("2");
4Thread h3 = new PrThread("3");
5h1.start ();
6h2.start ();
7h3.start ();
8h1.join ();
9h2.join ();
10h3.join ();
11}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 7: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/7.jpg)
Esperamos a que una hebra acabe
Metodo: join
h3.start()
h1.start()
h2.start()
h1.join()
h2.join()
h3.join()
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 8: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/8.jpg)
Esperamos a que una hebra acabe
Metodo: join
h3.start()
h1.start()
h2.start()
h1.join()
h2.join()
h3.join()
1 h1.start(): h1 se ejecuta.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 9: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/9.jpg)
Esperamos a que una hebra acabe
Metodo: join
h3.start()
h1.start()
h2.start()
h1.join()
h2.join()
h3.join()
1 h1.start(): h1 se ejecuta.
2 h2.start(): h2 se ejecuta.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 10: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/10.jpg)
Esperamos a que una hebra acabe
Metodo: join
h3.start()
h1.start()
h2.start()
h1.join()
h2.join()
h3.join()
1 h1.start(): h1 se ejecuta.
2 h2.start(): h2 se ejecuta.
3 h3.start(): h3 se ejecuta.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 11: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/11.jpg)
Esperamos a que una hebra acabe
Metodo: join
h3.start()
h1.start()
h2.start()
h1.join()
h2.join()
h3.join()
1 h1.start(): h1 se ejecuta.
2 h2.start(): h2 se ejecuta.
3 h3.start(): h3 se ejecuta.
4 h1.join(): esperamos a que h1
pare.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 12: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/12.jpg)
Esperamos a que una hebra acabe
Metodo: join
h3.start()
h1.start()
h2.start()
h1.join()
h2.join()
h3.join()
1 h1.start(): h1 se ejecuta.
2 h2.start(): h2 se ejecuta.
3 h3.start(): h3 se ejecuta.
4 h1.join(): esperamos a que h1
pare.
5 h2.join(): esperamos a que h2
pare.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 13: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/13.jpg)
Esperamos a que una hebra acabe
Metodo: join
h3.start()
h1.start()
h2.start()
h1.join()
h2.join()
h3.join()
1 h1.start(): h1 se ejecuta.
2 h2.start(): h2 se ejecuta.
3 h3.start(): h3 se ejecuta.
4 h1.join(): esperamos a que h1
pare.
5 h2.join(): esperamos a que h2
pare.
6 h3.join(): esperamos a que h3
pare (no hace falta).
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 14: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/14.jpg)
Cerrojos de objetos
Cada objeto en Java tiene un cerrojo
1synchronized (obj) {
2/* */
3}
El cerrojo puede abarcar a todo un metodo
1type method (...) {
2synchronized(this) {
3/* */
4}
1synchronized type method (...) {
2/* */
3}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 15: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/15.jpg)
Variables condicion
¿Que ocurre si todos los metodos son synchronized?
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 16: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/16.jpg)
Variables condicion
¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 17: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/17.jpg)
Variables condicion
¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez
¿Que falta para tener un monitor?
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 18: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/18.jpg)
Variables condicion
¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez
¿Que falta para tener un monitor? las variables condicion.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 19: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/19.jpg)
Variables condicion
¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez
¿Que falta para tener un monitor? las variables condicion.
Todos los objetos tienen los metodos wait(), notify() ynotifyAll().
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 20: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/20.jpg)
Variables condicion
¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez
¿Que falta para tener un monitor? las variables condicion.
Todos los objetos tienen los metodos wait(), notify() ynotifyAll().
Un objeto con todos los metodos synchronized es unmonitor con una sola variable condicion.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 21: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/21.jpg)
Variables condicion
¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez
¿Que falta para tener un monitor? las variables condicion.
Todos los objetos tienen los metodos wait(), notify() ynotifyAll().
Un objeto con todos los metodos synchronized es unmonitor con una sola variable condicion.
¿Que hacemos si hay varias variables condicion?
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 22: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/22.jpg)
Variables condicion
¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez
¿Que falta para tener un monitor? las variables condicion.
Todos los objetos tienen los metodos wait(), notify() ynotifyAll().
Un objeto con todos los metodos synchronized es unmonitor con una sola variable condicion.
¿Que hacemos si hay varias variables condicion? Todo monitorse puede hacer con una unica variable condicion, con perdidade eficiencia: metodo notifyAll().
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 23: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/23.jpg)
Monitor puente
Tiene dos variables condicion: norte y sur.
1procedure permiso(sentido s) {
2if (s.equals(Sentido.sur)) {
3espS ++;
4while ( numN > 0 || cupS >= maxCupo ) {
5wait(sur);
6}
7espS --; numS ++; cupN =0;
8if (espN >0) {
9cupS ++;
10}
11} else { // el sentido norte
12[[ similar ]]
13}
14}
15procedure finPermiso(sentido s) {
16if (s.equals(Sentido.sur)) {
17numS --;
18singal(norte);
19} else {// sentido norte
20[[ similar ....]]
21}
22}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 24: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/24.jpg)
Puente, version Java facil
1private int espN = 0, espS = 0;
2private int numN = 0, numS = 0;
3private int cupN = 0, cupS = 0;
4
5private int maxCupo;
6
7public synchronized void permiso(Sentido s) throws InterruptedException {
8if ( s.equals(Sentido.sur) ) {
9espS ++;
10while ( numN > 0 || cupS >=maxCupo ) { wait (); }
11espS --; numS ++;
12if ( espN >0 ) { cupS ++; }
13cupN =0;
14} else {
15/* sentido Norte , complementario al anterior */
16}
17}
18public synchronized void finPermiso(Sentido s) {
19if ( s.equals(Sentido.sur) ) { numS --; }
20else { numN --; }
21notifyAll ();
22}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 25: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/25.jpg)
Implementacion de monitores
1a idea: cada objeto es un semaforo
1Object norte , sur;
2public synchronized void permiso(Sentido s) {
3if ( s.equals(Sentido.sur) ) {
4espS ++;
5while ( numN >0 || cupS >= maxCupo ) {
6sur.wait ();
7}
8/* ... */
9} else {
10espN ++;
11while ( numS >0 || cupN >= maxCupo ) {
12norte.wait ();
13}
14/* ... */
15}
16}
Si el proceso se queda esperando en sur.wait(), no libera elobjeto monitor: ¡¡Se queda bloqueado!!
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 26: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/26.jpg)
Implementacion de monitores
1 Cada objeto es un semaforo.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 27: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/27.jpg)
Implementacion de monitores
1 Cada objeto es un semaforo.
2 Por cada variable condicion es necesario un objeto semaforo.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 28: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/28.jpg)
Implementacion de monitores
1 Cada objeto es un semaforo.
2 Por cada variable condicion es necesario un objeto semaforo.
3 Antes de esperar en un wait hemos de abandonar el monitor.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 29: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/29.jpg)
Implementacion de monitores
1 Cada objeto es un semaforo.
2 Por cada variable condicion es necesario un objeto semaforo.
3 Antes de esperar en un wait hemos de abandonar el monitor.
4 Es necesario un semaforo para entrar y salir del monitor.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 30: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/30.jpg)
Semaforos
1public final class Semaforo {
2String nombre;
3int s;
4public Semaforo(int inicial , String _nombre) {
5s=inicial;
6nombre=_nombre;
7} // Semaforo constructor
8public synchronized void P() throws InterruptedException {
9while (s==0) { wait (); }
10s--;
11}
12public synchronized void V() {
13s++;
14notify ();
15}
16}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 31: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/31.jpg)
Variables Condicion I
1 Una variable condicion basicamente es un semaforo.
2 Necesitamos tambien el semaforo del monitor para poder salirantes de un wait y entrar despues.
1Semaforo mutex;
2public final void Wait () throws InterruptedException {
3mutex.V();
4numEspera ++;
5s.P();
6mutex.P();
7}
Nota: el metodo wait es final en la clase Object.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 32: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/32.jpg)
Variables Condicion II
1public class VariableCondicion {
2int numEspera;
3Semaforo s;
4Semaforo mutex;
5public VariableCondicion(Semaforo _mutex , String nombre) {
6s = new Semaforo(0,nombre );
7numEspera = 0;
8mutex = _mutex;
9}
10public synchronized final void Signal () {
11if (numEspera >0) {
12numEspera --;
13s.V();
14}
15}
16}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 33: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/33.jpg)
Puente I
1public class Puente {
2VariableCondicion norte ,sur;
3Semaforo mutex;
4private int espN = 0, espS = 0;
5private int numN = 0, numS = 0;
6private int cupN = 0, cupS = 0;
7private int maxCupo;
8
9public void permiso(Sentido s) {
10mutex.P();
11if ( s.equals(Sentido.sur) ) {
12espS ++;
13while ( numN > 0 || cupS >=maxCupo ) { sur.Wait (); }
14espS --; numS ++;
15if ( espN >0 ) { cupS ++; }
16cupN =0;
17} else {
18/* sentido Norte , caso simetrico al anterior */
19}
20mutex.V();
21}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 34: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/34.jpg)
Puente II
1public void finPermiso(Sentido s) {
2mutex.P();
3if ( s.equals(Sentido.sur) ) {
4numS --;
5if (numS ==0) {norte.Signal ();};
6} else {
7numN --;
8if (numN ==0) {sur.Signal ();};
9}
10mutex.V();
11}
12public Puente(int cupo) {
13maxCupo = cupo;
14mutex = new Semaforo(1,"mutex");
15norte = new VariableCondicion(mutex ,"norte");
16sur = new VariableCondicion(mutex ,"norte");
17}
18}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 35: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/35.jpg)
Puente III
1package simulacion.puente;
2public class Coche extends Thread {
3private Sentido sentido;
4private int id , tEnPuente;
5private long horaInicio;
6private Puente puente;
7public Coche (int i, Sentido s, int t, Puente p){
8sentido = s; id = i; tEnPuente = t; puente = p;
9}
10public void run() {
11System.out.println("El coche "+id+" quiere pasar en sentido "+
12sentido + ":" + SimulaPuente.tiempoSimulacion ());
13puente.permiso(sentido );
14System.out.println("El coche "+id+" aest pasando en sentido "+
15sentido + ":" + SimulaPuente.tiempoSimulacion ());
16try {
17this.sleep(tEnPuente *1000);
18} catch ( InterruptedException e ) {}
19puente.finPermiso(sentido );
20System.out.println("El coche "+id+" ha pasado en sentido "+
21sentido + ":" + SimulaPuente.tiempoSimulacion ());
22}
23}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 36: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/36.jpg)
Puente IV
1public SimulaPuente(double tLlegadaN , double tLlegadaS , int tPuente , int tMax) {
2Puente puente = new Puente (5);
3GeneradorCoches generaNorte = new GeneradorCoches(Sentido.norte ,
4tLlegadaN ,
5tPuente , tMax ,
63333,
7puente );
8GeneradorCoches generaSur = new GeneradorCoches(Sentido.sur ,
9tLlegadaS ,
10tPuente , tMax ,
111111,
12puente );
13generaNorte.start ();
14generaSur.start ();
15horaInicio = System.currentTimeMillis ();
16try {
17generaNorte.join ();
18generaSur.join ();
19} catch ( InterruptedException e ) {
20} // end of try -catch
21}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 37: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/37.jpg)
Puente V
1package simulacion.puente;
2class SimulaPuente {
3private static int numUsuario = 0;
4private static long horaInicio;
5
6public synchronized static int sigUsuario () {
7numUsuario ++;
8return numUsuario;
9}
10public static int tiempoSimulacion () {
11return (int )(( System.currentTimeMillis () - horaInicio )/( long )1000);
12}
13public SimulaPuente(double tLlegadaN , double tLlegadaS , int tPuente , int tMax) {
14/* Cuerpo de simula Puente */
15}
16public static void main (String [] args) {
17SimulaPuente p = new SimulaPuente (2, 2, 1, 20);
18} // end of main ()
19}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 38: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/38.jpg)
Puente VI
1package simulacion.puente;
2import soporte.Aleatorio;
3public class GeneradorCoches extends Thread {
4private Sentido sentido;
5private double tLlegadaMedioCoches;
6private int tEnPuente;
7private int tMaxSimulacion;
8private Aleatorio aleatorio;
9private Puente puente;
10public GeneradorCoches (Sentido stdo , double tll , int tp , int tm , int sm , Puente p){
11sentido = stdo;
12tLlegadaMedioCoches = tll;
13tEnPuente = tp;
14tMaxSimulacion = tm;
15aleatorio = new Aleatorio(sm);
16puente = p;
17}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 39: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/39.jpg)
Puente VII
1public void run() {
2System.out.println("Empezando el sentido "+ sentido );
3do {// do -while ( tiempo < tMaxSimulacion )
4int sigCoche = aleatorio.poisson(tLlegadaMedioCoches );
5try {
6this.sleep(sigCoche *1000);
7
8} catch ( InterruptedException e ) {
9
10} // end of try -catch
11Coche coche = new Coche(SimulaPuente.sigUsuario (), sentido , tEnPuente , p
12coche.start ();
13} while ( SimulaPuente.tiempoSimulacion () < tMaxSimulacion );
14
15}
16}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 40: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/40.jpg)
Capturando InterruptedException I
Semaforo
1public synchronized void P() throws InterruptedException {
2while (s==0) {
3try {
4wait (); /* Si me interrumpen ıaqu ocupamos el asemforo ,
5pero lazamos la oexcepcin */
6} catch (InterruptedException e) {
7s--;
8throw e;
9}
10}
11s--;
12}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 41: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/41.jpg)
Capturando InterruptedException II
VariableCondicion
1public final void Wait () throws InterruptedException {
2mutex.V();
3numEspera ++;
4try {
5s.P();
6} catch (InterruptedException e) {
7/* Se ha interrumpido un proceso esperando en esta ariable ocondicin .
8* El asemforo se queda sin ocupar (ver Semaforo .java), ahabr que decir que
9* esta hebra no aest esperando */
10numEspera --;
11throw e;
12}
13try {
14mutex.P();
15} catch (InterruptedException e) {
16/* Se ha interrumpido un proceso que ıhaba sido autorizado para entrar
17* en la variable ocondicin . aHabr que liberar mutex y el asemforo.*/
18numEspera --;
19s.V();
20mutex.V();
21throw e;
22}
23}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 42: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/42.jpg)
Capturando InterruptedException III
1public void permiso(Sentido s) throws InterruptedException {
2try {
3mutex.P();/* si interrumpen antes de entrar ,
4no entramos y liberamos el monitor.
5*/
6} catch (InterruptedException e) {
7mutex.V();
8throw e;
9}
10if ( s.equals(Sentido.sur) ) {
11espS ++;
12while ( numN > 0 || cupS >=maxCupo ) {sur.Wait (); }
13espS --; numS ++;
14if ( espN >0 ) {cupS ++;}
15cupN =0;
16} else {
17espN ++;
18while ( numS > 0 || cupN >=maxCupo ) {norte.Wait (); }
19espN --; numN ++;
20if ( espS >0 ) {cupN ++;}
21cupS =0;
22} // end of else
23mutex.V();
24}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 43: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/43.jpg)
Capturando InterruptedException IV
1public void finPermiso(Sentido s) throws InterruptedException {
2try {
3mutex.P();/* Si me interrumpen ıaqu tengo que restaurar liberar el
4monitor y despertar a quien lo necesite */
5} catch (InterruptedException e) {}
6
7if ( s.equals(Sentido.sur) ) {
8numS --;
9if (numS ==0) {norte.Signal ();};
10} else {
11numN --;
12if (numN ==0) {sur.Signal ();};
13}
14mutex.V();
15}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 44: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/44.jpg)
Capturando InterruptedException I
Es mejor no interrumpir una hebra dentro del monitor, mejoresperar a que salga.
Dentro del monitor tenemos una variable ie que indica si lahebra ha sido interrumpida.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 45: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/45.jpg)
Capturando InterruptedException II
Es mejor no interrumpir una hebra dentro del monitor, mejoresperar a que salga.
Dentro del monitor tenemos una variable ie que indica si lahebra ha sido interrumpida.
mutex.P, Wait, no lanzan una excepciones.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 46: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/46.jpg)
Capturando InterruptedException III
Es mejor no interrumpir una hebra dentro del monitor, mejoresperar a que salga.
Dentro del monitor tenemos una variable ie que indica si lahebra ha sido interrumpida.
mutex.P, Wait, no lanzan una excepciones.Devolveran unaexcepcion en caso de haberse producido.
Si devuelven una excepcion el monitor lanza esa excepcion alfinal.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 47: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/47.jpg)
Capturando InterruptedException IV
1public void permiso(Sentido s) throws InterruptedException {
2InterruptedException ie=null;
3ie=mutex.P(ie);
4
5if ( s.equals(Sentido.sur) ) {
6espS ++;
7while ( numN > 0 || cupS >=maxCupo ) { ie=sur.Wait(ie); }
8espS --; numS ++;
9if ( espN >0 ) { cupS ++; }
10cupN =0;
11} else {// sentido Norte
12espN ++;
13while ( numS > 0 || cupN >=maxCupo ) {ie=norte.Wait(ie);}
14espN --; numN ++;
15if ( espS >0 ) {cupN ++;}
16cupS =0;
17}
18mutex.V();
19if (ie!=null) {
20throw ie;
21}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 48: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/48.jpg)
Capturando InterruptedException V
1public void finPermiso(Sentido s) throws InterruptedException {
2InterruptedException ie=null;
3ie=mutex.P(ie);
4if ( s.equals(Sentido.sur) ) {
5numS --;
6if (numS ==0) {norte.Signal ();};
7} else {// Sentido norte
8numN --;
9if (numN ==0) {sur.Signal ();};
10}
11mutex.V();
12if (ie!=null) {
13throw ie;
14}
15}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 49: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/49.jpg)
Capturando InterruptedException VI
1public final InterruptedException Wait(InterruptedException ie) {
2synchronized (this) {numEspera ++;}
3mutex.V();
4ie=s.P(ie);
5ie=mutex.P(ie);
6return ie;
7}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 50: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/50.jpg)
Capturando InterruptedException VII
1public synchronized InterruptedException P(InterruptedException ie) {
2while (s==0) {
3try {
4wait ();
5} catch (InterruptedException e) {
6ie=e;
7}
8}
9s--;
10return ie;
11}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 51: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/51.jpg)
Capturando InterruptedException VIII
1public void run() {
2try {
3System.out.println("El coche "+id+" quiere pasar en sentido "+ sentido + ":"
4try {
5puente.permiso(sentido );
6System.out.println("El coche "+id+" aest pasando en sentido "+ sentido +
7sleep(tEnPuente *1000);
8
9} catch (InterruptedException e) {
10System.out.println("El coche "+id+" ha sido interrumpido");
11} finally {
12puente.finPermiso(sentido );
13}
14System.out.println("El coche "+id+" ha pasado en sentido "+ sentido + ":" +
15} catch ( InterruptedException e ) {
16
17} // end of try -catch
18}
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 52: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/52.jpg)
Problemas, mejoras
Las entradas y las salidas del monitor se hacen de formaexplıcita.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 53: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/53.jpg)
Problemas, mejoras
Las entradas y las salidas del monitor se hacen de formaexplıcita. Reflexion en Java.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java
![Page 54: Programación Concurrente en Java - Hebras y monitores](https://reader034.fdocuments.ec/reader034/viewer/2022052300/58904fbd1a28abb31c8b4c91/html5/thumbnails/54.jpg)
Problemas, mejoras
Las entradas y las salidas del monitor se hacen de formaexplıcita. Reflexion en Java.
Control explıcito sobre las colas de procesos, variablescondicion priorizadas.
Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid
Programacion Concurrente en Java