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
Preleva sorgente  GeSHi: Java

  1. package darshan.multithread.autobus;
  2. import java.util.concurrent.Semaphore;
  3. import java.util.logging.Level;
  4. import java.util.logging.Logger;
  5. /**
  6.  *
  7.  * @author darshan
  8.  */
  9. public class Stazione {
  10. public Semaphore imbarco;
  11. public Semaphore coda_stazione;
  12. public Semaphore coda_bus;
  13. private static long starttime;
  14. public static int PMAX=5;
  15. static{
  16. starttime=System.currentTimeMillis();
  17. }
  18. public Stazione() {
  19. imbarco=new Semaphore(1,true);
  20. coda_stazione=new Semaphore(0,true);
  21. coda_bus=new Semaphore(0,true);
  22. }
  23. public static void log(String stringa){
  24. long tick=(System.currentTimeMillis()-starttime)/10;
  25. stringa="["+tick+"] " + Thread.currentThread().getName()+": "+stringa;
  26. System.out.println(stringa);
  27. }
  28. public static void delay(long min, long max){
  29. try {
  30. Thread.sleep(min + (long) (Math.random() * (max-min)));
  31. } catch (InterruptedException ex) {
  32. Logger.getLogger(Stazione.class.getName()).log(Level.SEVERE, null, ex);
  33. }
  34. }
  35. }


la classe del bus
Bus.java
Preleva sorgente  GeSHi: Java

  1. package darshan.multithread.autobus;
  2. import java.util.logging.Level;
  3. import java.util.logging.Logger;
  4. public class Bus extends Thread {
  5. Stazione stazione;
  6. public Bus(Stazione stazione, String name) {
  7. this.stazione = stazione;
  8. this.setName(name);
  9. }
  10. @Override
  11. public void run(){
  12. while (true){
  13. try {
  14. work();
  15. } catch (InterruptedException ex) {
  16. Logger.getLogger(Bus.class.getName()).log(Level.SEVERE, null, ex);
  17. }
  18. }
  19. }
  20. private void work() throws InterruptedException {
  21. int n;
  22. Stazione.delay(1000, 5000);
  23. stazione.imbarco.acquire();
  24. Stazione.log("blocco l'imbarco");
  25. n=stazione.coda_stazione.getQueueLength();
  26. if(n>Stazione.PMAX)n=Stazione.PMAX;
  27. for(int a=0; a<n; a++){
  28. stazione.coda_stazione.release();
  29. Stazione.delay(200, 1000);
  30. }
  31. Stazione.log("bus carico, sblocco l'imbarco");
  32. stazione.imbarco.release();
  33. Stazione.delay(2000, 6000);
  34. stazione.coda_bus.release(n);
  35. Stazione.log("bus arrivato a destinazione");
  36. }
  37. }

a classe del passeggero
Passeggero.java
Preleva sorgente  GeSHi: Java

  1. package darshan.multithread.autobus;
  2. import java.util.logging.Level;
  3. import java.util.logging.Logger;
  4. public class Passeggero extends Thread {
  5. Stazione stazione;
  6. public Passeggero(Stazione stazione,String name) {
  7. this.stazione = stazione;
  8. this.setName(name);
  9. }
  10. @Override
  11. public void run(){
  12. while (true){
  13. try {
  14. work();
  15. } catch (InterruptedException ex) {
  16. Logger.getLogger(Passeggero.class.getName()).log(Level.SEVERE, null, ex);
  17. }
  18. }
  19. }
  20. private void work() throws InterruptedException {
  21. Stazione.delay(1000, 5000);
  22. stazione.imbarco.acquire();
  23. Stazione.log("Mi imbarco");
  24. stazione.imbarco.release();
  25. Stazione.log("Mi metto in coda alla stazione");
  26. stazione.coda_stazione.acquire();
  27. Stazione.log("Salgo nel bus");
  28. stazione.coda_bus.acquire();
  29. Stazione.log("Viaggio concluso!");
  30. }
  31. }


il main
Main.java
Preleva sorgente  GeSHi: Java

  1. package darshan.multithread.autobus;
  2. import java.util.Vector;
  3. public class Main {
  4. public static void main(String[] args) {
  5. int npasseggeri=15;
  6. Vector<Passeggero> passeggeri=new Vector<Passeggero>();
  7. Stazione s=new Stazione();
  8. Bus b=new Bus(s, "Bus");
  9. for(int a=0;a<npasseggeri;a++){
  10. Passeggero p=new Passeggero(s, "Passeggero "+(a+1));
  11. passeggeri.add(p);
  12. p.start();
  13. }
  14. b.start();
  15. }
  16. }



fonte: http://massimo30.net/forum/viewthread.php?thread_id=353&rowstart=20










Commenti

Post popolari in questo blog

Simulazioni di reti (con Cisco Packet Tracer)

Esercizi sulla rappresentazione della virgola mobile IEEE 754 (Floating Point)