En un sistema industrial existen tres sensores que realizan mediciones del nivel de temperatura, humedad y luz respectivamente. Cuando se han recogido mediciones de los tres sensores, existe un dispositivo “trabajador” encargado de realizar ciertas tareas según las mediciones realizadas. El dispositivo no puede comenzar a realizar sus tareas hasta que se han recogido mediciones de los tres sensores, y los sensores no pueden volver a realizar mediciones hasta que el dispositivo finaliza sus tareas. El proceso se repite de forma indefinida de manera que cuando el dispositivo finaliza sus tareas, volverá a esperar a que haya mediciones de los tres sensores. Realizar utilizando semáforos el modelado de dicho sistema. Modelar el dispositivo trabajador y cada sensor como una hebra (con lo cual habrá un total de 4 hebras). Modelar el proceso de realizar mediciones y las tareas del dispositivo con retrasos aleatorios y valores de tipo entero. Inicialmente puede suponerse que los sensores pueden comenzar haciendo peticiones.
import java.util.Random; import java.util.concurrent.Semaphore; public class Ejercicio1 { private static Semaphore semTrabajador = new Semaphore(0, true); private static Semaphore [] semsensores = new Semaphore[3]; private static int [] datos = new int[3]; private static Random r = new Random(); public static class Trabajador extends Thread { public void run (){ while(true){ try { semTrabajador.acquire(3); sleep(r.nextInt(500)); // tiempos de espera aleatorio simulando la tarea del trabajador //(tiempo que tarda el recoger los datos por ejemplo) System.out.println("Temperatura: " + datos[0]); System.out.println("Humedad: "+ datos[1]); System.out.println("Luz: " + datos[2] + "\n"); semsensores[0].release(); semsensores[2].release(); semsensores[1].release(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static class Sensor extends Thread { private int id; public Sensor(int id){ this.id = id; } public void run(){ while(true){ try { semsensores[id].acquire(); //coge el dato sleep(r.nextInt(500)); // tiempos de espera aleatorio simulando la tarea del sensor datos[id] = r.nextInt(50); //System.out.println("datos["+id+"] = "+ datos[id]); semTrabajador.release(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { // TODO Auto-generated method stub Trabajador trabajador = new Trabajador (); Sensor sensor0 = new Sensor (0); Sensor sensor1 = new Sensor (1); Sensor sensor2 = new Sensor (2); semsensores [0] = new Semaphore (1, true); semsensores [1] = new Semaphore (1, true); semsensores [2] = new Semaphore (1, true); trabajador.start (); sensor0.start (); sensor1.start (); sensor2.start (); } }
Dos tipos de procesos A y B entran en una habitación. Un proceso de tipo A no puede marcharse de la habitación hasta que no ha visto 2 procesos de tipo B. Un proceso de tipo B no puede marcharse de la habitación hasta que no ha visto 1 proceso de tipo A. Cualquier proceso (A o B) se marcha de la habitación en cuanto ha visto el número de procesos que necesita del otro tipo (no espera ninguna otra condición). Suponiendo que tienes NA procesos de tipo A y NB de tipo B, implementa este sistema utilizando un objeto sala que sincroniza a los procesos de tipo A y B, y que proporciona los métodos
void entraA(int id); y void entraB(int id);
import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.locks.*; public class Sala { static Lock l = new ReentrantLock(true); static Condition salirA= l.newCondition(); static Condition salirB = l.newCondition(); static List<Integer> listaA = new ArrayList<Integer>(); static List<Integer> listaB = new ArrayList<Integer>(); static int [] vistosA; static int [] vistosB; static ProcesoA [] procesosA; static ProcesoB [] procesosB; public void entraA(int id){ // Un proceso de tipo A no puede marcharse de la // habitación hasta que no ha visto 2 procesos de tipo B l.lock(); try{ listaA.add(id); System.out.println("Proceso A "+ id + " entra en la sala"); vistosA[id] = listaB.size(); System.out.println("\t Proceso A" + id + " ve a los procesos B "+ listaB.toString()); for(int b: listaB){ vistosB[b]++; System.out.println("\t Procesos A "+ id +" y B "+ b + " se ven"); } salirB.signalAll(); while(vistosA[id] < 2){ try { salirA.await(); } catch (InterruptedException e) {e.printStackTrace();} } listaA.remove(new Integer(id)); System.out.println("Proceso A "+ id + " ha salido de la sala"); } finally { l.unlock(); } } public void entraB(int id){ //Un proceso de tipo B no puede marcharse de la habitación hasta // que no ha visto 1 proceso de tipo A. l.lock(); try{ listaB.add(id); System.out.println("Proceso B "+ id + " entra en la sala"); vistosB[id] = listaA.size(); System.out.println("\t Proceso B "+id + " ve a los procesos A "+ listaA.toString()); for(int a: listaA){ vistosA[a]++; System.out.println("\t Procesos A "+ a +" y B "+ id + " se ven"); } salirA.signalAll(); while(vistosB[id] < 1){ try { salirB.await(); } catch (InterruptedException e) {e.printStackTrace();} } listaB.remove(new Integer(id)); System.out.println("Proceso B "+ id + " sale de la sala"); } finally { l.unlock(); } } static public class ProcesoA extends Thread{ int id; Sala sala; public ProcesoA(int id, Sala s){ this.id = id; this.sala = s; } public void run(){ this.sala.entraA(this.id); } } static public class ProcesoB extends Thread{ int id; Sala sala; public ProcesoB(int id, Sala s){ this.id = id; this.sala = s; } public void run(){ this.sala.entraB(this.id); } } public static void main(String[] args) { Random r = new Random(); int NA = r.nextInt(5)+2; int NB = r.nextInt(5)+2; System.out.println("NA = "+ NA + " NB = "+ NB); Sala s = new Sala(); vistosA = new int[NA]; vistosB= new int[NB]; procesosA = new ProcesoA [NA]; procesosB = new ProcesoB[NB]; for(int i =0; i < NA; i++){ procesosA[i] = new Sala.ProcesoA(i,s); } for(int i =0; i < NB; i++){ procesosB[i] = new Sala.ProcesoB(i,s); } for(int j =0; j < NB; j++){ procesosB[j].start(); } for(int i =0; i < NA; i++){ procesosA[i].start(); } } }
No hay comentarios:
Publicar un comentario