Esercizio sui Thread in Java: passeggeri in stazione degli autobus
Esercizio sui Thread in Java:
Ogni passeggero deve entrare nella stazione e poi entrare nel bus, quando il bus arriva blocca l'accesso alla stazione e carica quelli nella stazione dentro fino alla massima capienza.
per simulare questa situazione ho usato tre semafori, di cui due sono usati esclusivamente come code.
il primo determina se si possa o non si possa accedere alla stazione (e viene tenuto bloccato quando il bus sta caricando) e gli altri due sono le due code della stazione e del bus.
Stazione.java
la classe del bus
Bus.java
a classe del passeggero
Passeggero.java
il main
Main.java
fonte: http://massimo30.net/forum/viewthread.php?thread_id=353&rowstart=20
Ogni passeggero deve entrare nella stazione e poi entrare nel bus, quando il bus arriva blocca l'accesso alla stazione e carica quelli nella stazione dentro fino alla massima capienza.
per simulare questa situazione ho usato tre semafori, di cui due sono usati esclusivamente come code.
il primo determina se si possa o non si possa accedere alla stazione (e viene tenuto bloccato quando il bus sta caricando) e gli altri due sono le due code della stazione e del bus.
Stazione.java
package darshan.multithread.autobus; import java.util.concurrent.Semaphore; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author darshan */ public class Stazione { public Semaphore imbarco; public Semaphore coda_stazione; public Semaphore coda_bus; private static long starttime; public static int PMAX=5; static{ } public Stazione() { imbarco=new Semaphore(1,true); coda_stazione=new Semaphore(0,true); coda_bus=new Semaphore(0,true); } } public static void delay(long min, long max){ try { Logger.getLogger(Stazione.class.getName()).log(Level.SEVERE, null, ex); } } }
la classe del bus
Bus.java
package darshan.multithread.autobus; import java.util.logging.Level; import java.util.logging.Logger; Stazione stazione; this.stazione = stazione; this.setName(name); } @Override public void run(){ while (true){ try { work(); Logger.getLogger(Bus.class.getName()).log(Level.SEVERE, null, ex); } } } int n; Stazione.delay(1000, 5000); stazione.imbarco.acquire(); Stazione.log("blocco l'imbarco"); n=stazione.coda_stazione.getQueueLength(); if(n>Stazione.PMAX)n=Stazione.PMAX; for(int a=0; a<n; a++){ stazione.coda_stazione.release(); Stazione.delay(200, 1000); } Stazione.log("bus carico, sblocco l'imbarco"); stazione.imbarco.release(); Stazione.delay(2000, 6000); stazione.coda_bus.release(n); Stazione.log("bus arrivato a destinazione"); } }
a classe del passeggero
Passeggero.java
package darshan.multithread.autobus; import java.util.logging.Level; import java.util.logging.Logger; Stazione stazione; this.stazione = stazione; this.setName(name); } @Override public void run(){ while (true){ try { work(); Logger.getLogger(Passeggero.class.getName()).log(Level.SEVERE, null, ex); } } } Stazione.delay(1000, 5000); stazione.imbarco.acquire(); Stazione.log("Mi imbarco"); stazione.imbarco.release(); Stazione.log("Mi metto in coda alla stazione"); stazione.coda_stazione.acquire(); Stazione.log("Salgo nel bus"); stazione.coda_bus.acquire(); Stazione.log("Viaggio concluso!"); } }
il main
Main.java
package darshan.multithread.autobus; import java.util.Vector; public class Main { int npasseggeri=15; Vector<Passeggero> passeggeri=new Vector<Passeggero>(); Stazione s=new Stazione(); Bus b=new Bus(s, "Bus"); for(int a=0;a<npasseggeri;a++){ Passeggero p=new Passeggero(s, "Passeggero "+(a+1)); passeggeri.add(p); p.start(); } b.start(); } }
fonte: http://massimo30.net/forum/viewthread.php?thread_id=353&rowstart=20
Commenti
Posta un commento