next up previous contents
Next: Threads Example 6.2: Synchronized Up: Java Notes Previous: Threads: Synchronised Methods

Threads Example 6.1: Lost Update

/**
 * Adapted from The Java Tutorial
 * Second Edition by Campione, M. and
 * Walrath, K.Addison-Wesley 1998
 */
class CubbyHole{
  private int contents;
  private boolean available = false;
  
  public int get(){
	available = false;
	return contents;
  }
  
  public void put(int value){
	contents = value;
	available = true;
  }
}

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 + " got: " + value);
/*
	  try{//delay a bit after get (consume) to allow next put (produce)
		sleep((int)(Math.random() * 100));
	  } catch (InterruptedException e){ }
*/
	}
  }
}

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{//delay a bit after put (produce) to allow next get (consume)
		sleep((int)(Math.random() * 100));
	  } catch (InterruptedException e){ }
*/
	}
  }
}

public class ProducerConsumerTest1{
  public static void main(String[] args){
	CubbyHole c = new CubbyHole();
	Producer p1 = new Producer(c, 1);
	Consumer c1 = new Consumer(c, 1);
	
	p1.start();
	c1.start();
  }
}



Ananda Amatya
9/15/1999