Threads2 (other files are same as before): Main.java

import java.awt.*;
import javax.swing.*;
import java.util.concurrent.*;

/**
 * Main program for Threads demo
 */
public class Main extends JFrame {
    /** Our Row's */
    private CopyOnWriteArrayList<Row> rows = new CopyOnWriteArrayList<Row> ();

    public static void main (String [] args) {
	java.awt.EventQueue.invokeLater (new Runnable() {
            public void run() {
		new Main ();
            }
        });
    }

    public Main () {
	// Window setup
	setSize (500, 500);
	setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

	// Our canvas
	Canvas canvas = new Canvas (this);
	add (canvas);

	// Show our window
	setVisible (true);

	// First create our Supply row
	SupplyRow supply = new SupplyRow (new Rectangle (10, 10, 500-40, 40), //*1 One supply row
					  canvas); //*1
	rows.add (supply); //*1

	// Now create our regular ConsumerRow's and start() them
	for (int i=0; i<5; i++) {
		Row r = new ConsumerRow (new Rectangle (10, 100+i*75, 500-40, 40), //*2 5 Consumer rows
					 canvas, supply); //*2
		rows.add (r); //*2
	}
    }

    public void drawCanvas (Graphics g) {
	// Draw each of our Row's
	for (Row r: rows) r.draw (g); //*3 Draw all of our Row's (polymorphism)
    }
}
[download file]