Visualizzazione dei risultati da 1 a 3 su 3

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Innanzitutto, premessa: non è sempre facile (te lo posso garantire!) rappresentare in classi/oggetti delle logiche e dei comportamenti di persone che usano cose e tempistiche come quanto indicato nella traccia. Insomma, non è facile rappresentare scenari reali di vita.

    In questi casi bisogna analizzare bene le entità in gioco, valutare come rappresentarle e come metterle in relazione. Hai fatto questo? Tutto questo infatti viene PRIMA di qualunque questione o dubbio sui semafori!

    Le persone e l'istruttore potrebbero essere dei "thread". Io farei sicuramente anche una classe Corsia (che contiene il Semaphore, che può anche essere tenuto nascosto) e altrettanto sicuramente farei anche una classe Piscina (che contiene le N corsie).

    Siccome l'istruttore ha di certo un maggiore controllo sulla piscina rispetto alle persone-utenti, se proprio si volesse (scenario limite, da pignoli) si potrebbe astrarre la cosa in due interfacce distinte, implementate entrambe da Piscina. In modo che gli utenti non possano fare operazioni che invece l'istruttore può fare.

    Ti ritrovi con quanto detto? O no?
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  2. #2
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto, premessa: non è sempre facile (te lo posso garantire!) rappresentare in classi/oggetti delle logiche e dei comportamenti di persone che usano cose e tempistiche come quanto indicato nella traccia. Insomma, non è facile rappresentare scenari reali di vita.

    In questi casi bisogna analizzare bene le entità in gioco, valutare come rappresentarle e come metterle in relazione. Hai fatto questo? Tutto questo infatti viene PRIMA di qualunque questione o dubbio sui semafori!

    Le persone e l'istruttore potrebbero essere dei "thread". Io farei sicuramente anche una classe Corsia (che contiene il Semaphore, che può anche essere tenuto nascosto) e altrettanto sicuramente farei anche una classe Piscina (che contiene le N corsie).

    Siccome l'istruttore ha di certo un maggiore controllo sulla piscina rispetto alle persone-utenti, se proprio si volesse (scenario limite, da pignoli) si potrebbe astrarre la cosa in due interfacce distinte, implementate entrambe da Piscina. In modo che gli utenti non possano fare operazioni che invece l'istruttore può fare.

    Ti ritrovi con quanto detto? O no?
    Mi trovo assolutamente con la tua soluzione, ed infatti il metodo che ho riportato sopra appartiene ad una classe PiscinaSem. Siccome effettivamente è molto fuori contesto, inserisco tutta l'implementazione che ho detto della classe Piscina, escludendo i metodi da esporre all'istruttore. La traccia richiede sia una implementazione coi semafori che una con lock e condition, PiscinaSem estende Piscina che è una classe astratta che definisce i metodi principali da esportare ai threads.

    codice:
    public class PiscinaSem extends Piscina{	private Random r=new Random();
    	private int[] corsie;
    	private boolean eAperta;
    	private Semaphore mutexCorsie;
    	private Semaphore[] corsieSem;
    	private Semaphore mutexBool;
    	
    	public PiscinaSem(){
    		corsie=new int[4];
    		eAperta=false;
    		mutexCorsie=new Semaphore(1);
    		mutexBool=new Semaphore(1);
    		corsieSem=new Semaphore[5];
    		for(int i=0;i<5;i++){
    			corsieSem[i]=new Semaphore(4,true);
    		}
    	}
    	@Override
    	int corsiaMenoOccupata() throws InterruptedException {
    		mutexCorsie.acquire();
    		int indiceMin=indiceMin(corsie);
    		if(corsie[indiceMin]==4){
    			mutexCorsie.release();
    			return r.nextInt(5);
    		}
    		mutexCorsie.release();
    		return indiceMin;
    	}
    
    
    	private int indiceMin(int[] corsie2) {
    		int indice=0,min =corsie[0];
    		for(int i=0;i<corsie.length;i++){
    			if(corsie[i]<min){
    				indice=i;
    				min=corsie[i];
    			}
    		}
    		return indice;
    	}
    	@Override
    	void entraENuota(int numeroCorsia) throws InterruptedException {
    		corsieSem[numeroCorsia].acquire();
    		mutexCorsie.acquire();
    		corsie[numeroCorsia]++;
    		System.out.println(super.toString());
    
    
    		mutexCorsie.release();
    	}
    
    
    	@Override
    	void docciaEdEsci(int numeroCorsia) throws InterruptedException {
    		mutexCorsie.acquire();
    		corsie[numeroCorsia]--;
    		mutexCorsie.release();
    		corsieSem[numeroCorsia].release();
    	}
    }
    I thread, molto semplicemente, vengono costruiti con un'istanza di Piscina e vi accedono utilizzando i metodi implementati.

    Ho fatto qualche test e sembra funzionare, l'unico vero dubbio è sulla scelta del semaforo di mutua esclusione per leggere il minimo. Anche se non effettuo modifiche, uso la mutua esclusione perchè potrebbe essere modificato il valore di uno dei componenti dell'array dagli altri metodi, e potrei quindi avere una lettura sbagliata del minimo.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.