Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    18

    Threads: Produttori - Consumatori

    Sto studiando il modello produttori - Consumatori utilizzabdo i threads.
    Questo esempio trovato in rete permette che un consumatore(lettore) prelevi il dato prima che il produttore lo aggiorni.
    Quindi alcune volte il consumatore riesce a leggere il dato prima che sia stato agggiornato, e questo dovrebbe essere impedito da "private boolean available = false;"
    A me serve che questo non debba prorpio accadere.

    il codice:

    codice:
    public class ProducerConsumerTest {
    	
    	   public static void main(String[] args) {
    	      
    		  CubbyHole c = new CubbyHole();
    	      Producer p1 = new Producer(c, 1);
    	      Consumer c1 = new Consumer(c, 2);
    	
    	      p1.start(); 
    	      c1.start();
    	
    	   }
    	}
    
    /////////////////////////////////////////////////////
    
    	class CubbyHole {		//	Può capitare che il consumatore consumi prima che il produttore produca  !!!! 
    	   
    	   private int contents;
    	   private int c=4;
    	   private boolean available = false;
    	   
    	   public synchronized int get() {
    	      while (available == false) {
    	         try {
    	            wait();
    	         }
    	         catch (InterruptedException e) {
    	         }
    	      }
    	      available = false;
    	      notifyAll();
    	      return contents;
    	   }
    	   
    	   public synchronized void put(int value) {
    	      while (available == true) {
    	         try {
    	            wait();
    	         }
    	         catch (InterruptedException e) { 
    	         } 
    	      }
    	      contents = value;
    	      available = true;
    	      notifyAll();
    	   }
    	}
    	
    /////////////////////////////////////////////////////
    	
    	class Consumer extends Thread {
    	   
    	   private CubbyHole cubbyhole;
    	   private int number;
    	   
    	   public Consumer(CubbyHole c, int number) {
    	      cubbyhole = c;
    	      this.number = number;
    	   }
    	   
    	   public void run() {
    	      int value = 0;
    	         for (int i = 0; i < 10; i++) {
    	            value = cubbyhole.get();
    	            
    	            System.out.println("		Consumer #"	+ this.number + " get: " + value);
    	         }
    	   }
    	}
    	
    /////////////////////////////////////////////////////
    	
    	class Producer extends Thread {
    	
    		private CubbyHole cubbyhole;
    		private int number;
    
    		public Producer(CubbyHole c, int number) {
    			cubbyhole = c;
    			this.number = number;
    		}
    
    		public void run() {
    			for (int i = 0; i < 10; i++) {
    				
    					cubbyhole.put(i);
    					System.out.println("Producer #" + this.number + " put: " + i);
    				
    					try {
    					sleep((int)(Math.random() * 10));
    				} catch (InterruptedException e) { }
    			}
    		}
    	}

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    18
    Credo che il codice sia corretto.

    Indagando con dei contatori posizionati in vari punti del codice ed in un secondo momento facendone la stampa a video, ho rilevato che in realtà l' ordine con cui viene stampato a video non rispecchia l'ordine con cui vengono eseguiti i thread...

    :ciauz

  3. #3
    Esatto, in effetti non c'è alcuna garanzia che l'ordine con cui vengono stampati i messaggi sia lo stesso col quale vengono eseguite le operazioni di get() e put(), poichè la stampa dei messaggi non è sincronizzata. Una soluzione potrebbe essere quella di stampare direttamente i messaggi all'interno dei metodi get() e put(), subito dopo aver consumato/prodotto l'oggetto, passandogli come parametro il numero del produttore/consumatore (nel caso ve ne siano più d'uno e serva distinguerli).
    ***Ciao***

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.