Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    7

    [Java] Semaphore con coda FIFO

    Salve a tutti, volevo chiedervi una cosa riguardante la classe Semaphore Java.
    Nel fare degli esercizi sui Semaphore in Java mi sono imbattuto in uno che chiedeva di utilizzare la classe Semaphore per gestire una coda di veicoli su un ponte.
    Il ponte può "contenere" al massimo 10 veicoli, quelli in esubero aspettano al di fuori del ponte in una coda FIFO.
    Io ho, ingenuamente, pensato che la classe Semaphore gestisse in automatico la coda di Thread in modo FIFO, però ho notato che non è così.
    Ho provato a far transitare 11 veicoli sul ponte è dalle println ho notato che l'undicesimo veicolo non passa mai.
    Secondo voi come posso risolvere il problema?

    codice:
    public class Ponte {
    public final static int CAPIENZA=10;
    private int vetture;
    private Semaphore mutex,ponte;
    public Ponte(){
    vetture=0;
    mutex=new Semaphore(1);
    ponte=new Semaphore(CAPIENZA);
    }
    public void entra(int id){
    try{
    ponte.acquire();
    mutex.acquire();
    }catch(InterruptedException e){
    e.printStackTrace();
    }
    System.out.println("La vettura "+id+" entra nel punte");
    vetture++;
    mutex.release();
    }
    public void esci(int id){
    try{
    mutex.acquire();
    }catch(InterruptedException e){
    e.printStackTrace();
    }
    System.out.println("La vettura "+id+" e' uscita dal ponte");
    vetture--;
    mutex.release();
    ponte.release();
    
    }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    7
    ho visto una soluzione con coda FIFO ma utilizzando lock e condition..


    codice:
    public void entra() throws InterruptedException {
    		l.lock();
    		try {
    			vettureInAttesa.add(Thread.currentThread()); //LinkedList
    			while (!mioTurno()) {
    				postoLibero.await();
    			}
    			vettureInAttesa.removeFirst();
    			numPostiLiberi--;
    		} finally {
    			l.unlock();
    		}
    	}
    
    	private boolean mioTurno() {
    		return numPostiLiberi > 0
    				&& vettureInAttesa.getFirst().equals(Thread.currentThread());
    	}
    
    	public void libera() {
    		l.lock();
    		try {
    			numPostiLiberi++;
    			postoLibero.signalAll();
    		} finally {
    			l.unlock();
    		}
    	}
    qualcuno per favore sa indicarmi una soluzione per i semafori?

  3. #3
    Il codice non sembra sbagliato... il fatto che l'11° veicolo non entri mai può dipendere dal fatto che non fai mai concludere i thread e quindi rimanendo i 10 thread bloccati l'11° non entra mai.

    Controlla il codice dei thread e vedi se in qualche modo li termini.
    lolide
    Java Programmer

    Informati

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 © 2025 vBulletin Solutions, Inc. All rights reserved.