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) { } } } }

Rispondi quotando
***Ciao*** 