import java.awt.*; /** * SupplyRow starts with fixed list of Box's and gives them away, * is not a process */ public class SupplyRow extends Row { //*1 Passive object, NOT a thread public SupplyRow (Rectangle loc, Canvas canvas) { super (loc, canvas); // Our initial set of boxes for (int i=0; i<22; i++) { boxes.add (new Box ()); } } /** * Give away one of our boxes * Need a single, "synchronized" routine * that reports whether we have any to give * AND takes it ("test and set") * So this routine tries to give a box, * returns the Box if succeeds, or null if fails */ public synchronized Box take() { //*2 Need synchronized method if (boxes.size()>0) { //*3 Tests and takes in one uninterruptible unit Box ans = boxes.remove (0); //*3 canvas.repaint (); //*4 Since we just decreased our list, need repaint return ans; //*3 } else return null; //*3 } //*2 }