import java.awt.*;
/**
* SupplyRow makes boxes, is a process
*/
public class SupplyRow extends Row implements Runnable { //*1 Also uses a thread now
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 ());
}
// Start a new thread to run us
Thread thread = new Thread (this); //*1
thread.start(); //*1
}
/**
* Method for Runnable
* This one never quits
*/
public void run () { //*1
while (true) { //*1
add(); //*1
// Since we just added to our list, need repaint
canvas.repaint ();
try {
Thread.sleep (1000 + (int) (500 * Math.random ())); // 1-1.5 seconds //*1
} catch (InterruptedException e) { }
}
}
/**
* Give away one of our boxes
* If we have no more, WAIT till we get some, never return null.
*/
public synchronized Box take() { //*2 Wait here for a notify() indicating more boxes
if (boxes.size()==0) { //*2
try {
wait(); //*2
} catch (InterruptedException e) { }
}
Box ans = boxes.remove (0); //*3 At this point size must be >0, give away the box
// Since we just decreased our list, need repaint
canvas.repaint ();
return ans;
}
/**
* Add a new box, and wake up waiting take()
* need this in a synchronized method
*/
private synchronized void add () { //*4 Need to keep this code in a synchronized method
boxes.add (new Box ()); //*4
notify(); //*4
}
}