Listing 16: The Runner Class using System; using System.Threading; namespace Calculator { public class Runner { public static void Main(string [] args) { Calculator calc = new Calculator(); Thread calcThread = new Thread( new ThreadStart(calc.CalcPowersOfTwo)); Printer printer1 = new Printer(); printer1.PrinterName = "First Printer"; Thread p1Thread = new Thread( new ThreadStart(printer1.PrintPowersOfTwo)); p1Thread.IsBackground = true; Printer printer2 = new Printer(); printer2.PrinterName = "Second Printer"; Thread p2Thread = new Thread( new ThreadStart(printer2.PrintPowersOfTwo)); p2Thread.IsBackground = true; Printer printer3 = new Printer(); printer3.PrinterName = "Third Printer"; Thread p3Thread = new Thread( new ThreadStart(printer3.PrintPowersOfTwo)); p3Thread.IsBackground = true; Printer printer4 = new Printer(); printer4.PrinterName = "Fourth Printer"; Thread p4Thread = new Thread( new ThreadStart(printer4.PrintPowersOfTwo)); p4Thread.IsBackground = true; calcThread.Start(); p1Thread.Start(); p2Thread.Start(); p3Thread.Start(); p4Thread.Start(); // Wait for the Calculator thread to finish calcThread.Join(); // Signal the QueueReady event to allow a printer thread // to drain the queue of any remaining values Calculator.QueueReady.Set(); Console.ReadLine(); } } }